Избежать деления на ноль в 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;