避免在SELECT和WHERE子句中进行双重计算

时间:2019-06-20 12:47:02

标签: sql sql-server sql-server-2012

让我们假设我有一个名为myTable的表,该表有两列:id和value。我还有一个名为someFunction的函数,该函数根据myTable的ID计算某些内容。现在,如果我想选择函数结果小于100的记录,并显示该函数的结果,该怎么做?

该查询看起来还可以,但是它不会两次计算相同的东西吗?在WHERE子句中然后在SELECT子句中?

   SELECT dbo.someFunction(mt.id, date), mt.id
   FROM myTable mt
   WHERE dbo.someFunction(mt.id, date) < 100

有没有一种方法可以将其重新编写为伪代码:

   SELECT 'RESULT', mt.id
   FROM myTable mt
   WHERE dbo.someFunction(mt.id, date) < 100 as 'RESULT'

2 个答案:

答案 0 :(得分:2)

一种方法使用apply

SELECT v.funval, mt.id
FROM myTable mt CROSS APPLY
     (VALUES (dbo.someFunction(mt.id, date)) v(funcval)
WHERE funcval < 100;

SQL Server只能对此进行一次评估。

答案 1 :(得分:0)

是的,在查询中两次使用函数会导致函数被调用两次,您可以简单地使用子查询来避免函数被调用两次,就像这样...

SELECT mt.*
FROM (
        SELECT dbo.someFunction(id, date) AS RESULT, id
        FROM myTable
    ) mt
WHERE mt.RESULT < 100