2

我已经使用 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 上进行了测试,结果始终相同。

4

1 回答 1

2

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

于 2013-07-04T17:55:14.630 回答