在SQL中进行评估的情况

时间:2013-07-04 17:49:29

标签: sql sql-server case aggregate lazy-evaluation

我已经使用SQLServer多年了,并且总是使用延迟评估来理解CASE表达式,它允许在实际尝试转换之前检查字符串值是否包含有效日期。

今天我发现这种情况似乎并非如此。经过一些简化后,这是一个简单的例子来展示它(不要试图找到任何计算意义,只是一个愚蠢的例子):

select b, sum(case when b<> 0 then a / b end)
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1
) x group by b

这正常,正如我所料。

select b, case when b<> 0 then sum(a / b) end
from (
    select 1 as a, 1 as b union select 1, 0 union select 0, 1
) x group by b

这会抛出错误(零分割)。

似乎与聚合函数有关的东西,不知怎的,总和是在案例之前进行评估,但我必须遗漏一些东西而不知道是什么。

我对此很好奇,因为有一些解决方法并且没有真正的问题。

顺便说一句,我在SQLServer 2005和SQLServer 2008上测试它,然后在Oracle 11g上测试它,结果总是相同。

1 个答案:

答案 0 :(得分:2)

在第二个版本中,必须为整个结果集计算聚合sum(a/b),因为其中没有每行条件。然后每一行使用CASE表达式决定是否包含该值。