错误的子句聚合错误时可变

问题描述

为什么该查询抛出除零错误

declare @d int =1
select
case when @d=1 then sum(1)
               else  sum(1/0)
end

但是,如果我们删除聚合或将变量更改为常数,则一切正常。

解决方法

大多数情况下,CASE短路并且按照the docs的行为

CASE表达式按顺序评估其条件并停止 满足条件的第一个条件

但是有some exceptions。这是其中之一,在同一文档中已明确标出

出现在CASE参数中的汇总表达式 首先评估表达式,然后提供给CASE表达式。 例如,以下查询在以下情况下产生除以零的错误 产生MAX集合的值。这发生在 评估CASE表达。

,

从逻辑上讲,聚合操作是在选择(ref)之前执行的。因此,将在执行选择内的SUM(1/0)表达式之前计算CASE。这应该可以解释在SQL Server或任何理智的RDBMS中的行为。