我有一个SQL查询,用于导致
除以零例外
我把它包装在CASE
语句中以阻止这种情况发生。有没有更简单的方法呢?
这是我的代码:
Percentage = CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END
答案 0 :(得分:39)
更好的方法是使用NULLIF,如下所示:
Percentage = 100 * ClubTotal / NULLIF(AttTotal, 0)
答案 1 :(得分:7)
我使用NULLIF
位的方式不同,因为在某些情况下我必须返回一些值。通常,当存在除零误差时,我需要返回0。在那种情况下,我将整个表达式包装在ISNULL
中。所以它会是:
Percentage = ISNULL(100 * ClubTotal / NULLIF(AttTotal, 0), 0)
内部部分评估为NULL
,然后ISNULL
将其替换为0.
答案 2 :(得分:5)
Percentage = IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)
答案 3 :(得分:1)
在我看来,CASE声明正是要走的路。而不是计算某些东西,而是为AttTotal为零的情况指出要返回的值。您甚至可以添加另一个案例分支,其中0为0为100%。
只是旁注:当AttTotal为零且ClubTotal大于零时,我不会返回0。 NULL可能更合适。或者你会创建字符串(例如'10 .50%')而不是数字(例如10.5%),如果AttTotal为零,则包含“无att.total”:
PercentageString :=
CASE
WHEN AttTotal = 0 AND ClubTotal = 0 then '100%'
WHEN AttTotal = 0 AND ClubTotal <> 0 THEN 'No att. total'
ELSE to_char(ClubTotal / AttTotal * 100) || '%'
END;
答案 4 :(得分:0)
我发现处理除零问题的解决方案是创建一个我可以调用以处理这种情况的函数,因为我经常需要执行某种比率/百分比类型分析。这是我写的简单函数。
Create Function fnRatio(@Numerator decimal(10,2),@Demoninator decimal(10,2))
Returns decimal(10,2)
Begin
Return
Case
When @Demoninator = 0 then 0.00
When @Demoninator Is Null then Null
Else
@Numerator/@Demoninator
End
结束
此致
杰森