根据标量函数结果过滤SQL查询

时间:2015-06-09 23:41:32

标签: sql sql-server

在SQL Server中,我似乎无法在WHERE子句中使用别名列

这不起作用

SELECT *, [dbo].[myFunc] (X.Prop1) AS Width 
FROM X 
WHERE Width > 0

我必须做

SELECT *, [dbo].[myFunc] (X.Prop1) AS Width 
FROM X 
WHERE [dbo].[myFunc] (X.Prop1) > 0

我担心的是SQL正在执行[dbo].[myFunc] (X.Prop1)两次。

我的问题是:

  • 是执行两次还是SQL Server足够智能?
  • 有没有办法在WHERE子句中使用别名列?

3 个答案:

答案 0 :(得分:2)

当我尝试两种方式时,它们具有完全相同的执行计划,因此看起来查询优化器足够聪明,可以发现它们是相同的查询并运行一次... 所以我认为两种方式都可以......

但是如果想使用子查询方法并使用别名,你可以使用这样的东西:

Select * from (
SELECT *, [dbo].[myFunc] (X.Prop1) AS Width FROM X 
) T
WHERE Width > 0

答案 1 :(得分:2)

我不确定它是否被计算两次,但你可以使用CROSS APPLY来避免这种情况:

SELECT *, Width  
FROM X 
CROSS APPLY (Select [dbo].[myFunc] (X.Prop1)) N(Width)
WHERE Width > 0

查看此fiddle,选择大于10的值的平方。

答案 2 :(得分:2)

您可以使用Common Table Expression (CTE)

;WITH cteMyData AS
(
   SELECT *, [dbo].[myFunc] (X.Prop1) AS Width 
   FROM X
)
SELECT * FROM cteMyData WHERE Width > 0