避免在PostgreSQL中除以零

时间:2013-07-16 15:56:06

标签: sql postgresql null aggregate-functions divide-by-zero

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

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

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

5 个答案:

答案 0 :(得分:142)

您可以使用NULLIF功能,例如

something/NULLIF(column_name,0)

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

答案 1 :(得分:29)

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

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

Quoting the manual about aggregate functions:

  

应该注意除count外,这些函数返回a   没有选择行时为空值。

答案 2 :(得分:24)

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

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

<强> 注意: 我的偏好是返回NULL,如在Erwin和Yuriy的回答中,或者通过在除法运算之前检测值为0并返回0来逻辑地解决这个问题。否则,使用1

可能会误传数据

答案 3 :(得分:1)

如果你希望当计数为零时分频器为1:

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

trueinteger的演员阵容为1。

答案 4 :(得分:1)

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

/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/cmake/debug/obj/x86
/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/cmake/debug/obj/armeabi-v7a
/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/transforms/stripDebugSymbol/debug/0/lib/armeabi-v7a
/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/transforms/stripDebugSymbol/debug/0/lib/x86
/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/armeabi-v7a
/Users/homefolder/AndroidStudioProjects/myapp/app/build/intermediates/transforms/mergeJniLibs/debug/0/lib/x86