PostgreSQL - 使用SUM意外除零

问题描述 投票:7回答:2

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

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它的工作原理。

这怎么可能?

postgresql postgresql-9.4
2个回答
2
投票

我喜欢这个问题,我求助于这些tough guys

策划者有罪:

CASE不能阻止评估其中包含的聚合表达式,因为聚合表达式是在SELECT列表或HAVING子句中的其他表达式被考虑之前计算的

更多细节在https://www.postgresql.org/docs/10/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL


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

或者:您可以使用以下内容并避免“案例”

 SELECT  SUM(price / power(amount,sign(amount))) u_cena
 FROM t
 GROUP BY id, price, amount
© www.soinside.com 2019 - 2024. All rights reserved.