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

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
  );

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.


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] 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.