Evitar un error de división por cero en una columna calculada

8

¿Cómo se evita el error dividir por cero en la tabla a continuación?

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
fuente
1
Si no es válido que Denominator sea cero, puede agregar una restricción de verificación en esa columna. Sin embargo, eso no responde la pregunta, ya que solo da como resultado un error más significativo (más cercano a la fuente del problema) en lugar de evitar un error por completo.
David Spillett
¿Tiene intención de utilizar la división de enteros aquí o no?
Martin Smith
¿Ha considerado no permitir que 0 sea un valor en esa columna? Por lo general, lo que he visto es un sproc que se usa para aplicaciones cliente, en lugar de SQL simple.

Respuestas:

12

Simplemente agregue un caso especial para la división 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
  );
Philᵀᴹ
fuente
44
O tal vez devuelva NULL en lugar de 0 si los NULL no son un problema para la lectura de código de esa columna, ya que el resultado de dividir por cero no es realmente 0 a menos que el numerador sea 0.
David Spillett
3
Sí, se fue como ejercicio para el OP, para ser honesto. Evitar el error ha sido respondido :)
Philᵀᴹ
10

Similar a la solución de @ Phil:

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

Si Denominator es 0, se asigna a nulo a través de nullif. Como cualquier cosa dividida entre nulo es nulo, el resultado se vuelve nulo en este caso.

Lennart
fuente
Por supuesto, esta es la solución más limpia. Yo aceptaría este.
Christiaan Westerbeek
-2
case 
 when Denominator=0 then 0 
 else Numerator/ Denominator 
end as [Result] 
m409
fuente