PostgreSQL - неожиданное деление на ноль с использованием SUM - PullRequest
0 голосов
/ 27 августа 2018

Этот запрос (минимальный воспроизводимый пример):

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 голосов
/ 06 сентября 2018

Мне понравился этот вопрос, и я обратился за помощью к этим крутым парням :

Виновник:

CASE не может предотвратить оценку составного выражения, содержащегося внутри него, потому что агрегированные выражения вычисляются раньше других выражения в списке SELECT или предложении HAVING считаются

Подробнее на https://www.postgresql.org/docs/10/static/sql-expressions.html#SYNTAX-EXPRESS-EVAL

0 голосов
/ 27 августа 2018

Я не могу понять, почему "почему", но вот обходной путь ...

 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
...