Простой способ предотвратить ошибку Divide By Zero в SQL

У меня есть SQL-запрос, который используется для возникновения исключения Divide By Zero, я завернул его в оператор CASE, чтобы это не происходило. Есть ли более простой способ сделать это?

Здесь мой код:

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

Ответ 1

Хороший способ сделать это - использовать NULLIF следующим образом:

Percentage =  100 * ClubTotal / NULLIF(AttTotal, 0)

Ответ 2

Я использую бит NULLIF по-разному, потому что в некоторых случаях мне нужно вернуть некоторое значение. Обычно мне нужно возвращать 0, когда есть деление на нулевую ошибку. В этом случае я завершаю все выражение в ISNULL. Так было бы:

Percentage =  ISNULL(100 * ClubTotal / NULLIF(AttTotal, 0), 0)

Внутренняя часть оценивается как NULL, а затем ISNULL заменяет ее на 0.

Ответ 3

Percentage =  IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)

Ответ 4

По-моему, выражение CASE - это именно то, что нужно. Вместо вычисления чего-либо вы указываете значение, возвращаемое для случая, когда AttTotal равен нулю. Вы даже можете добавить другую ветвь case для 0 из 0, равную 100%.

Просто боковое примечание: я бы не вернулся 0, когда AttTotal равен нулю, а ClubTotal больше нуля. NULL может быть более уместным. Или вы создадите строки (например, "10.50%" ), а не цифры (например, 10,5%), содержащие "No att. Total", если AttTotal равен нулю:

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;

Ответ 5

Решение, которое я нашел для решения проблемы с делением на ноль, состоит в том, чтобы создать функцию, с которой я могу обратиться, чтобы справиться с ситуацией, поскольку мне часто приходится выполнять какой-то анализ отношения/процентного типа. Здесь простую функцию, которую я написал.

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 

End

Привет

Джейсон