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

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
Akhil
источник
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
  );
Philᵀᴹ
источник
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, он отображается в ноль через нуль. Поскольку все, что делится на ноль, равно нулю, в этом случае результат становится нулевым.

Леннарт
источник
Конечно, это самое чистое решение. Я бы принял это.
Кристиан Вестербик
-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
m409
источник