“case when”内的聚合 - 执行顺序是什么?

Arc*_*ord 5 postgresql evaluation group-by

为什么这个简单的查询会导致“除以零”错误?

select 
case when b > 0 then sum(a / b) end
from (values (1,1),(2,1),(1,0),(2,0)) t (a,b)
group by b
Run Code Online (Sandbox Code Playgroud)

我期望输出:

案件
3
无效的

我唯一的解释是 postgres 在进行分组和评估案例之前计算总和。

Ant*_*rig 6

请参阅文档

\n
\n

[\xe2\x80\xa6] aCASE无法阻止对其中包含的聚合表达式求值,因为聚合表达式是在列表中的其他\n表达式之前计算的,SELECT或者HAVING考虑例如,以下查询可能会导致被零除错误,尽管看似已经采取了防范措施:

\n
SELECT CASE WHEN min(employees) > 0\n            THEN avg(expenses / employees)\n       END\nFROM departments;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

因此,预计聚合表达式sum(a/b)会在其他表达式之前计算。这不仅适用于Postgresql,也适用于Sql Server。

\n