我想在 SELECT 子句中执行除法。当我加入一些表并使用聚合函数时,我经常将空值或零值作为分隔符。至于现在,我只提出了这种避免除以零和空值的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法来做到这一点?
我想在 SELECT 子句中执行除法。当我加入一些表并使用聚合函数时,我经常将空值或零值作为分隔符。至于现在,我只提出了这种避免除以零和空值的方法。
(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
或者更简单,但是,NULLIF()
就像Yuriy 提供的一样。
需要注意的是,除了 之外
count
,这些函数在没有选择行时返回空值。
我意识到这是一个老问题,但另一个解决方案是利用最大的功能:
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
从to的演员表integer
是 1。