让我们假设我有一个名为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'
答案 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