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