问题描述
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中的行为。