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

Mat*_*att 5 sql sql-server

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

这不起作用

SELECT *, [dbo].[myFunc] (X.Prop1) AS Width 
FROM X 
WHERE Width > 0
Run Code Online (Sandbox Code Playgroud)

我要做

SELECT *, [dbo].[myFunc] (X.Prop1) AS Width 
FROM X 
WHERE [dbo].[myFunc] (X.Prop1) > 0
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

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

Ara*_*ram 2

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

但是如果想使用子查询方法并使用别名,您可以使用如下所示的内容:

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