Ответ 1
Хороший способ сделать это - использовать NULLIF следующим образом:
Percentage = 100 * ClubTotal / NULLIF(AttTotal, 0)
У меня есть SQL-запрос, который используется для возникновения исключения Divide By Zero, я завернул его в оператор 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)
Внутренняя часть оценивается как NULL
, а затем ISNULL
заменяет ее на 0.
Percentage = IsNull(ClubTotal/NullIf(AttTotal, 0) * 100, 0)
По-моему, выражение 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;
Решение, которое я нашел для решения проблемы с делением на ноль, состоит в том, чтобы создать функцию, с которой я могу обратиться, чтобы справиться с ситуацией, поскольку мне часто приходится выполнять какой-то анализ отношения/процентного типа. Здесь простую функцию, которую я написал.
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
Привет
Джейсон