我已经使用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上测试它,结果总是相同。
答案 0 :(得分:2)
在第二个版本中,必须为整个结果集计算聚合sum(a/b)
,因为其中没有每行条件。然后每一行使用CASE
表达式决定是否包含该值。