我有一个 SQL 查询,它曾经导致
除以零异常
我已将其包装在一份CASE
声明中以阻止这种情况发生。有没有更简单的方法来做到这一点?
这是我的代码:
Percentage = CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END
我有一个 SQL 查询,它曾经导致
除以零异常
我已将其包装在一份CASE
声明中以阻止这种情况发生。有没有更简单的方法来做到这一点?
这是我的代码:
Percentage = CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END
一个更好的方法是像这样使用NULLIF:
Percentage = 100 * ClubTotal / NULLIF(AttTotal, 0)
我使用NULLIF
有点不同,因为在某些情况下我必须返回一些值。通常,当出现除以零错误时,我需要返回 0。在这种情况下,我将整个表达式包装在ISNULL
. 所以它会是:
Percentage = ISNULL(100 * ClubTotal / NULLIF(AttTotal, 0), 0)
内部部分被评估为0 NULL
,然后ISNULL
将其替换为 0。
Percentage = IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)
在我看来,CASE 声明正是要走的路。在 AttTotal 为零的情况下,您不是计算要返回的值,而是说明要返回的值。您甚至可以为 0 of 0 为 100% 添加另一个案例分支。
附带说明:当 AttTotal 为零且 ClubTotal 大于零时,我不会返回 0。NULL 可能更合适。或者您将创建字符串(例如 '10.50%')而不是数字(例如 10.5%),在 AttTotal 为零的情况下包含“No 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;
我发现处理除以零问题的解决方案是创建一个我可以调用的函数来处理这种情况,因为我经常需要执行某种比率/百分比类型的分析。这是我编写的简单函数。
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
结尾
问候
杰森