在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)
两次。
我的问题是:
WHERE
子句中使用别名列?答案 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