Подтвердить что ты не робот

Избегайте деления на ноль в PostgreSQL

Я хотел бы выполнить деление в предложении SELECT. Когда я присоединяюсь к некоторым таблицам и использую агрегированную функцию, у меня часто есть нулевые или нулевые значения в качестве разделителей. На данный момент я только придумал этот способ избежать деления на нулевые и нулевые значения.

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 

Интересно, есть ли лучший способ сделать это?

4b9b3361

Ответ 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.