我想在SELECT子句中进行除法运算,当我连接一些表并使用聚合函数时,我经常使用null或零值作为除法器,目前我只想到了这种避免被零和null值除法的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1 ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法来做这件事?
siotufzp1#
您可以使用NULLIF函数,例如
something/NULLIF(column_name,0)
如果column_name的值为0 -整个表达式的结果将为NULL
column_name
qij5mzcb2#
由于**count()从不返回NULL**(与其他聚合函数不同),因此只需捕获0情况(这是唯一有问题的情况)。
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之外,当没有选择行时,这些函数返回空值。
NULLIF()
count
yfjy0ee73#
我知道这是一个老问题,但另一个解决方案是利用 greatest 函数:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
***注意:***我的偏好是返回NULL,如Erwin和Yuriy的答案,或者通过在除法运算之前检测值是否为0并返回0来逻辑地解决这个问题。否则,使用1可能会错误地表示数据。
1
vjhs03f74#
另一种避免被零除的解决方案,替换为1
select column + (column = 0)::integer;
1tuwyuhd5#
如果希望计数为零时分频器为1:
count(column_name) + 1 * (count(column_name) = 0)::integer
从true到integer的强制转换为1。
true
integer
sh7euo9m6#
我按照建议做了以下操作,效果很好column_name / COALESCE(NULLIF(column_name,0), 1)即使是sum函数也可以像下面这样工作:
column_name / COALESCE(NULLIF(column_name,0), 1)
sum
( sum(column_name) :: decimal / COALESCE( NULLIF(sum(other_column_name) :: decimal, 0),1) :: decimal * 100 )
6条答案
按热度按时间siotufzp1#
您可以使用NULLIF函数,例如
如果
column_name
的值为0 -整个表达式的结果将为NULLqij5mzcb2#
由于**
count()
从不返回NULL
**(与其他聚合函数不同),因此只需捕获0
情况(这是唯一有问题的情况)。或者更简单,使用
NULLIF()
,like Yuriy provided。Quoting the manual about aggregate functions:
应该注意的是,除了
count
之外,当没有选择行时,这些函数返回空值。yfjy0ee73#
我知道这是一个老问题,但另一个解决方案是利用 greatest 函数:
***注意:***我的偏好是返回NULL,如Erwin和Yuriy的答案,或者通过在除法运算之前检测值是否为
0
并返回0
来逻辑地解决这个问题。否则,使用1
可能会错误地表示数据。vjhs03f74#
另一种避免被零除的解决方案,替换为1
1tuwyuhd5#
如果希望计数为零时分频器为1:
从
true
到integer
的强制转换为1。sh7euo9m6#
我按照建议做了以下操作,效果很好
column_name / COALESCE(NULLIF(column_name,0), 1)
即使是
sum
函数也可以像下面这样工作: