在函数结果中使用HAVING子句选择

时间:2014-12-28 11:17:33

标签: sql-server-2008 tsql

我很难解决如何使用HAVING子句避免函数调用两次。

这是我的qry:

select col1, col2, dbo.someFunction(param1, param2) as col3
from...
where ...
group ...
having dbo.someFunction(param1, param2) > 0

如果我写了

having col3 > 0

服务器sais:Invalid column name 'col3 '.

有没有办法在显示的情况下使用HAVING而不调用函数dbo.someFunction两次?

修改

我的执行计划包括: enter image description here

没有(评论): enter image description here

在选择中选择不带功能: enter image description here

2 个答案:

答案 0 :(得分:2)

你确定它是两次打电话吗?

我从以下两个查询中获得相同的执行计划

select enumID 
from docSVenum1
group by enumID 
having COUNT(*)  > 2000  


select enumID, count(*) as ccount
from docSVenum1
group by enumID 
having COUNT(*)  > 2000

答案 1 :(得分:0)

为了不调用该函数两次但引用列col3中返回的结果,您将需要围绕查询的另一个SELECT语句,如下所示。

SELECT col1,
    col2,
    col3
FROM
   (SELECT col1, 
       col2, 
       dbo.someFunction(param1, param2) AS col3 
   FROM ... 
   WHERE... ) AS Result
GROUP BY ...
HAVING col3 > 0

您无法在同一"嵌套级别"上通过别名引用列。对于SELECT,这就是为什么你必须在另一个SELECT语句中包含初始结果的原因,你可以通过它的别名引用该列。