我想在SELECT子句中执行除法。当我加入一些表并使用聚合函数时,我通常将null或零值用作分隔符。到目前为止,我只想出这种避免被零值和空值相除的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法?
我想在SELECT子句中执行除法。当我加入一些表并使用聚合函数时,我通常将null或零值用作分隔符。到目前为止,我只想出这种避免被零值和空值相除的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法?
Answers:
由于count()
永不返回NULL
(与其他聚合函数不同),您只需要抓住0
情况(无论如何这是唯一有问题的情况):
CASE count(column_name)
WHEN 0 THEN 1
ELSE count(column_name)
END
应当注意,除了之外
count
,这些函数在未选择任何行时都将返回空值。
我意识到这是一个古老的问题,但是另一个解决方案是利用最大的功能:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
注意:
我的偏好是返回一个NULL(如Erwin和Yuriy的答案一样),或者通过检测值0
在除法运算之前并返回来从逻辑上解决这个问题0
。否则,使用可能会误解数据1
。
如果要在计数为零时将分频器设为1,请执行以下操作:
count(column_name) + 1 * (count(column_name) = 0)::integer
从true
转换integer
为1。
CASE
即使更冗长,速度也更快。