避免在PostgreSQL中除以零

问题描述 投票:44回答:5

我想在SELECT子句中执行除法。当我连接一些表并使用聚合函数时,我经常使用null或零值作为分隔符。至于现在我只想出这种避免零和空值除法的方法。

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

我想知道是否有更好的方法来做到这一点?

sql postgresql null aggregate-functions divide-by-zero
5个回答
31
投票

由于count()永远不会返回NULL(与其他聚合函数不同),您只需要捕获0案例(无论如何这是唯一有问题的案例):

CASE count(column_name)
   WHEN 0 THEN 1
   ELSE count(column_name)
END

Quoting the manual about aggregate functions:

应该注意的是,除了count之外,当没有选择行时,这些函数返回空值。


156
投票

您可以使用NULLIF函数,例如

something/NULLIF(column_name,0)

如果column_name的值为0 - 整个表达式的结果将为NULL


26
投票

我意识到这是一个老问题,但另一个解决方案是利用最大的功能:

greatest( count(column_name), 1 )  -- NULL and 0 are valid argument values

注意:我的偏好是返回NULL,如在Erwin和Yuriy的答案中,或者通过在除法运算之前检测值为0并返回0来逻辑地解决这个问题。否则,使用1可能会误传数据。


2
投票

避免除以零的另一种解决方案,替换为1

select column + (column = 0)::integer;

1
投票

如果您希望在计数为零时分频器为1:

count(column_name) + 1 * (count(column_name) = 0)::integer

trueinteger的演员是1。

© www.soinside.com 2019 - 2024. All rights reserved.