Избегайте деления на ноль в PostgreSQL
Я хотел бы выполнить деление в предложении SELECT. Когда я присоединяюсь к некоторым таблицам и использую агрегированную функцию, у меня часто есть нулевые или нулевые значения в качестве разделителей. На данный момент я только придумал этот способ избежать деления на нулевые и нулевые значения.
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
Интересно, есть ли лучший способ сделать это?
Ответы
Ответ 1
Так как count()
никогда не возвращает NULL
(в отличие от других агрегатных функций), вам нужно только поймать случай 0
(что является единственным проблемным случаем):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
Указание руководства об агрегатных функциях:
Следует отметить, что кроме count
эти функции возвращают null, когда ни одна строка не выбрана.
Ответ 2
Вы можете использовать функцию NULLIF, например.
something/NULLIF(column_name,0)
Если значение column_name
равно 0, результат полного выражения будет NULL
Ответ 3
Я понимаю, что это старый вопрос, но другим решением было бы использовать самую большую функцию:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
Примечание:
Мое предпочтение заключалось бы в том, чтобы либо вернуть NULL, как в ответах Эрвина, и Юрия, либо решить это логически, указав значение 0
до операции деления и вернув 0
. В противном случае данные могут быть искажены с помощью 1
.
Ответ 4
Если вы хотите, чтобы делитель был равен 1, когда счетчик равен нулю:
count(column_name) + 1 * (count(column_name) = 0)::integer
Листинг от true
до integer
равен 1.