在SQL中防止Divide By Zero错误的简单方法

时间:2013-10-28 09:22:23

标签: sql sql-server-2008 tsql sql-server-2005

我有一个SQL查询,用于导致

  

除以零例外

我把它包装在CASE语句中以阻止这种情况发生。有没有更简单的方法呢?

这是我的代码:

Percentage =  CASE WHEN AttTotal <> 0 THEN (ClubTotal/AttTotal) * 100 ELSE 0 END

5 个答案:

答案 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 

结束

此致

杰森