我想在SELECT子句中执行除法。当我连接一些表并使用聚合函数时,我经常使用null或零值作为分隔符。至于现在我只想出这种避免零和空值除法的方法。
(CASE(COALESCE(COUNT(column_name),1)) WHEN 0 THEN 1
ELSE (COALESCE(COUNT(column_name),1)) END)
我想知道是否有更好的方法可以做到这一点?
答案 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
从true
到integer
的演员阵容为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