避免在PostgreSQL中被零除

sbtkgmzw  于 2023-03-08  发布在  PostgreSQL
关注(0)|答案(6)|浏览(180)

我想在SELECT子句中进行除法运算,当我连接一些表并使用聚合函数时,我经常使用null或零值作为除法器,目前我只想到了这种避免被零和null值除法的方法。

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

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

siotufzp

siotufzp1#

您可以使用NULLIF函数,例如

something/NULLIF(column_name,0)

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

qij5mzcb

qij5mzcb2#

由于**count()从不返回NULL**(与其他聚合函数不同),因此只需捕获0情况(这是唯一有问题的情况)。

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

或者更简单,使用NULLIF()like Yuriy provided
Quoting the manual about aggregate functions:
应该注意的是,除了count之外,当没有选择行时,这些函数返回空值。

yfjy0ee7

yfjy0ee73#

我知道这是一个老问题,但另一个解决方案是利用 greatest 函数:

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

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

vjhs03f7

vjhs03f74#

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

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

1tuwyuhd5#

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

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

trueinteger的强制转换为1。

sh7euo9m

sh7euo9m6#

我按照建议做了以下操作,效果很好
column_name / COALESCE(NULLIF(column_name,0), 1)
即使是sum函数也可以像下面这样工作:

(
sum(column_name) :: decimal / COALESCE(
  NULLIF(sum(other_column_name) :: decimal, 0),1) :: decimal * 100
)

相关问题