PostgreSQL-使用SUM意外除以零

时间:2018-08-27 16:50:46

标签: postgresql postgresql-9.4

此查询(最小可重复示例):

WITH t as (
    SELECT 3 id, 2 price, 0 amount
)
SELECT 
    CASE WHEN amount > 0 THEN
        SUM(price / amount)
    ELSE
        price
    END u_price
FROM t
GROUP BY id, price, amount

在PostgreSQL 9.4上抛出

  

除以零

在没有SUM的情况下有效。

这怎么可能?

2 个答案:

答案 0 :(得分:2)

我喜欢这个问题,并向以下tough guys寻求帮助:

计划者有罪:

  

CASE无法阻止对包含的聚合表达式的求值   在其中,因为聚合表达式先于其他表达式进行计算   会考虑SELECT列表或HAVING子句中的表达式

更多详情,请访问https://www.postgresql.org/docs/10/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL

答案 1 :(得分:0)

我无法弄清楚“为什么”部分,但这是一种解决方法...

 WITH t as (
      SELECT 3 id, 2 price, 0 amount
 )
 SELECT  SUM(price / case when amount = 0 then 1 else amount end) u_cena
 FROM t
 GROUP BY id, price, amount

OR:您可以使用以下内容来避免出现“情况”

 SELECT  SUM(price / power(amount,sign(amount))) u_cena
 FROM t
 GROUP BY id, price, amount