在 PostgreSQL 中避免除零

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

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

我想知道是否有更好的方法来做这件事?

124773 次浏览

你可以使用 NULLIF函数。

something/NULLIF(column_name,0)

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

如果计数为零时,除数器为1:

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

trueinteger的演员阵容是1。

由于 ABC0永远不会返回 NULL(与其他聚合函数不同) ,您只需要捕获 0情况(这是唯一有问题的情况)。因此,你的问题简化了:

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

或者更简单,但是,使用 NULLIF()就像尤里提供的那样

Quoting the manual about aggregate functions:

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

I realize this is an old question, but another solution would be to make use of the 太棒了 function:

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

注: 我倾向于返回一个 NULL,就像 Erwin 和 Yuriy 的答案一样,或者通过在除法操作之前检测值是 0并返回 0来逻辑地解决这个问题。否则,使用 1可能会误报数据。

Another solution avoiding division by zero, replacing to 1

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