此查询(最小可重现的示例):
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
它的工作原理。
这怎么可能?
我喜欢这个问题,我求助于这些tough guys:
策划者有罪:
CASE不能阻止评估其中包含的聚合表达式,因为聚合表达式是在SELECT列表或HAVING子句中的其他表达式被考虑之前计算的
更多细节在https://www.postgresql.org/docs/10/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL
我无法想出“为什么”的部分,但这是一个解决方法......
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