【问题标题】:PostgreSQL - Unexpected division by zero using SUMPostgreSQL - 使用 SUM 意外除以零
【发布时间】:2018-08-27 16:50:46
【问题描述】:

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

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 10 (10.3) 上的行为相同。
  • 似乎与 CTE 有关,因为... FROM ( values (3, 2, 0) ) as t(id, price, amount) ... 工作正常。可能值得logging as a bug

标签: postgresql postgresql-9.4


【解决方案1】:

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

策划者有罪:

CASE 不能阻止对包含的聚合表达式进行求值 在其中,因为聚合表达式在其他表达式之前计算 考虑 SELECT 列表或 HAVING 子句中的表达式

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

【讨论】:

    【解决方案2】:

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

     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
    

    【讨论】:

    • 我猜这与在结果中使用“总和”有关。这对我来说似乎是一个合乎逻辑的黑洞,但我不是 100% 确定。 . 就称它为 Oracle 认证 DBA 的直觉吧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 2021-08-05
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多