110

我想在 SELECT 子句中执行除法。当我加入一些表并使用聚合函数时,我经常将空值或零值作为分隔符。至于现在,我只提出了这种避免除以零和空值的方法。

(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END) 

我想知道是否有更好的方法来做到这一点?

4

5 回答 5

279

您可以使用NULLIF函数,例如

something/NULLIF(column_name,0)

如果值为column_name0 - 整个表达式的结果将为 NULL

于 2013-07-16T15:59:56.630 回答
57

由于count()永不返回NULL(与其他聚合函数不同),您只需抓住0案例(无论如何这是唯一有问题的案例)。因此,您的查询简化了:

CASE count(column_name)
   WHEN 0 THEN 1
   ELSE count(column_name)
END

或者更简单,但是,NULLIF()就像Yuriy 提供的一样。

引用关于聚合函数的手册:

需要注意的是,除了 之外count,这些函数在没有选择行时返回空值。

于 2013-07-16T17:04:16.560 回答
50

我意识到这是一个老问题,但另一个解决方案是利用最大的功能:

greatest( count(column_name), 1 )  -- NULL and 0 are valid argument values

注意: 我的偏好是返回一个 NULL,如 Erwin 和 Yuriy 的回答,或者通过检测值0在除法运算之前逻辑地解决这个问题,然后返回0. 否则,数据可能会因使用1.

于 2014-10-23T17:19:03.307 回答
8

另一种避免被零除的解决方案,替换为1

select column + (column = 0)::integer;
于 2018-05-15T21:02:52.420 回答
3

如果您希望在计数为零时除法器为 1:

count(column_name) + 1 * (count(column_name) = 0)::integer

true从to的演员表integer是 1。

于 2013-07-16T16:14:13.373 回答