我想在 SELECT 子句中执行除法。当我连接一些表并使用聚合函数时,我经常使用空值或零值作为分隔符。至于现在,我只提出了这种避免除以零和空值的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1 ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法来做这件事?
你可以使用 NULLIF函数。
something/NULLIF(column_name,0)
如果 column_name的值为0-则整个表达式的结果为 NULL
column_name
如果计数为零时,除数器为1:
count(column_name) + 1 * (count(column_name) = 0)::integer
从 true到 integer的演员阵容是1。
true
integer
由于 ABC0永远不会返回 NULL(与其他聚合函数不同) ,您只需要捕获 0情况(这是唯一有问题的情况)。因此,你的问题简化了:
NULL
0
CASE count(column_name) WHEN 0 THEN 1 ELSE count(column_name) END
或者更简单,但是,使用 NULLIF(),就像尤里提供的那样。
NULLIF()
Quoting the manual about aggregate functions:
应该注意的是,除了 count之外,这些函数返回一个 当没有选择任何行时,为空值。
count
I realize this is an old question, but another solution would be to make use of the 太棒了 function:
greatest( count(column_name), 1 ) -- NULL and 0 are valid argument values
注: 我倾向于返回一个 NULL,就像 Erwin 和 Yuriy 的答案一样,或者通过在除法操作之前检测值是 0并返回 0来逻辑地解决这个问题。否则,使用 1可能会误报数据。
1
Another solution avoiding division by zero, replacing to 1
select column + (column = 0)::integer;