我想在SELECT子句中执行除法。当我连接一些表并使用聚合函数时,我经常使用null或零值作为分隔符。至于现在我只想出这种避免零和空值除法的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法来做到这一点?
由于count()
永远不会返回NULL
(与其他聚合函数不同),您只需要捕获0
案例(无论如何这是唯一有问题的案例):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
Quoting the manual about aggregate functions:
应该注意的是,除了
count
之外,当没有选择行时,这些函数返回空值。
您可以使用NULLIF函数,例如
something/NULLIF(column_name,0)
如果column_name
的值为0 - 整个表达式的结果将为NULL
我意识到这是一个老问题,但另一个解决方案是利用最大的功能:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
注意:我的偏好是返回NULL,如在Erwin和Yuriy的答案中,或者通过在除法运算之前检测值为0
并返回0
来逻辑地解决这个问题。否则,使用1
可能会误传数据。
避免除以零的另一种解决方案,替换为1
select column + (column = 0)::integer;
如果您希望在计数为零时分频器为1:
count(column_name) + 1 * (count(column_name) = 0)::integer
从true
到integer
的演员是1。