Как избежать ошибки деления на ноль в вычисляемом столбце


8

Как избежать ошибки деления на ноль в таблице ниже?

CREATE TABLE [dbo].[TblDivision]
(
    [Numerator] int NOT NULL,
    [Denominator] int NOT NULL,
    [Result] AS (Numerator/ Denominator)
)
GO
Insert into (Numerator, Denominator) TblDivision values (3,0)
GO

1
Если знаменатель не равен нулю, вы можете добавить проверочное ограничение для этого столбца. Это не отвечает на вопрос, поскольку приводит только к более значимой ошибке (ближе к источнику проблемы), а не к полному устранению ошибки.
Дэвид Спиллетт

Вы собираетесь использовать здесь целочисленное деление или нет?
Мартин Смит

Считаете ли вы, что 0 не должно быть значением в этом столбце? Обычно я видел sproc для клиентских приложений, а не обычный SQL.

Ответы:


12

Просто добавьте специальный случай для деления на 0:

CREATE TABLE [dbo].[TblDivision]
  (
  [Numerator] int NOT NULL,
  [Denominator] int NOT NULL,
  [Result] AS case when Denominator=0 then 0 else (Numerator/ Denominator) end
  );

4
Или, возможно, вернуть NULL вместо 0, если NULL не являются проблемой для чтения кода в этом столбце, поскольку результат деления на ноль в действительности не равен 0, если числитель не равен 0.
Дэвид Спиллетт

3
Да, оставил как упражнение для ОП, если честно. Ответ об ошибке был получен :)
Philᵀᴹ

10

Аналогично решению @ Phil:

CREATE TABLE dbo.TblDivision
(    Numerator int NOT NULL
,    Denominator int NOT NULL
,    Result AS Numerator / nullif(Denominator,0)
);

Если знаменатель равен 0, он отображается в ноль через нуль. Поскольку все, что делится на ноль, равно нулю, в этом случае результат становится нулевым.


Конечно, это самое чистое решение. Я бы принял это.
Кристиан Вестербик

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.