Evitando um erro de divisão por zero em uma coluna computada


8

Como você evita o erro de divisão por zero na tabela abaixo?

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

11
Se o Denominator for inválido como zero, você poderá adicionar uma restrição de verificação nessa coluna. Isso não responde à pergunta, pois apenas resulta em um erro mais significativo (mais próximo da origem do problema), em vez de evitar um erro completo.
David Spillett

Você pretende usar a divisão inteira aqui ou não?
Martin Smith

Você considerou não permitir que 0 seja um valor nessa coluna? Normalmente, o que eu vi é um sproc sendo usado para aplicativos clientes, em vez de SQL simples.

Respostas:


12

Basta adicionar um caso especial para divisão por 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
Ou talvez retornar NULL em vez de 0 se nulos não são um problema para o código lendo essa coluna, como resultado da divisão por zero não é realmente 0 a menos que o numerador é 0.
David Spillett

3
Sim, deixou como um exercício para o OP, para ser honesto. Evitar o erro foi respondida :)
Philᵀᴹ

10

Semelhante à solução de @ Phil:

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

Se Denominator for 0, ele será mapeado para null via nullif. Como qualquer coisa dividida por nulo é nula, o resultado se torna nulo nesse caso.


Claro que esta é a solução mais limpa. Eu aceitaria este.
Christiaan Westerbeek

-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.