Netezza не делает ленивые оценки дел заявления? - PullRequest
3 голосов
/ 30 марта 2011

Я выполняю вычисление, которое может содержать деление на 0, и в этом случае я хочу, чтобы результатом было произвольное значение (55).К моему удивлению, завершение вычисления оператором case не помогло!

select case when 1=0 then 3/0 else 55 end

ОШИБКА HY000: Разделите на 0

Почему это так?Есть ли другой обходной путь?

1 Ответ

4 голосов
/ 30 марта 2011

хорошо, я был неточным. Это точный запрос, который завершается с «делением на 0»:

select case when min(baba) = 0 then 55 else sum(1/baba) end from t group by baba

Это похоже на ленивый сбой оценки из Netezza, так как обратите внимание, что я группирую по baba, поэтому, когда baba равен 0, это также означает, что min(baba) равно 0, и оценка должна быть изящно остановлена ​​без добраться до 1/baba термина и потерпеть неудачу при делении на 0. Верно? ну нет.

Я предполагаю, что здесь есть недочеты, и причина сбоя заключается в том, что Netezza оценивает термины строк, прежде чем сможет вычислить агрегированные термины. Таким образом, он должен оценивать 1/baba и baba в каждой строке, и только тогда он может оценивать агрегированные термины min(baba) и sum(1/baba)

Итак, обходной путь (для меня) был: select case when min(baba) = 0 then 55 else 1/min(baba) end from t group by baba, который имеет то же значение.

...