避免在PostgreSQL中除以零

Wil*_*ino 55 sql postgresql null aggregate-functions divide-by-zero

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

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 
Run Code Online (Sandbox Code Playgroud)

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

Yur*_*ter 162

您可以使用NULLIF函数,例如

something/NULLIF(column_name,0)
Run Code Online (Sandbox Code Playgroud)

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

  • 像value/COALESCE(NULLIF(column_name,0),1)这样的东西我觉得可行 (8认同)
  • 这是许多除以零问题的完美语义解决方案!有时您不希望除法是其他值,您希望根本不计算它! (3认同)

Erw*_*ter 33

由于count()永远不会返回NULL(与其他聚合函数不同),您只需要捕获0大小写(这是唯一有问题的情况):

CASE count(column_name)
   WHEN 0 THEN 1
   ELSE count(column_name)
END
Run Code Online (Sandbox Code Playgroud)

引用有关聚合函数的手册:

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


vol*_*ron 28

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

greatest( count(column_name), 1 )  -- NULL and 0 are valid argument values
Run Code Online (Sandbox Code Playgroud)

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


Man*_*vel 8

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

select column + (column = 0)::integer;
Run Code Online (Sandbox Code Playgroud)