¿Cómo evitar el error "dividir por cero" en SQL?

Resuelto Henrik Staun Poulsen asked hace 15 años • 19 respuestas

Tengo este mensaje de error:

Mensaje 8134, nivel 16, estado 1, línea 1 Error de división por cero encontrado.

¿Cuál es la mejor manera de escribir código SQL para no volver a ver este mensaje de error nunca más?

Podría hacer cualquiera de las siguientes cosas:

  • Agregue una cláusula donde para que mi divisor nunca sea cero

O

  • Podría añadir una declaración de caso, para que haya un tratamiento especial para cero.

¿Es la mejor forma de utilizar una NULLIFcláusula?

¿Existe una mejor manera o cómo se puede hacer cumplir?

Henrik Staun Poulsen avatar May 14 '09 13:05 Henrik Staun Poulsen
Aceptado

Para evitar un error de "División por cero" lo hemos programado así:

Select Case when divisor=0 then null
Else dividend / divisor
End ,,,

Pero aquí hay una forma mucho mejor de hacerlo:

Select dividend / NULLIF(divisor, 0) ...

Ahora el único problema es recordar el bit NullIf, si uso la tecla "/".

Henrik Staun Poulsen avatar May 14 '2009 06:05 Henrik Staun Poulsen

En caso de que desee devolver cero, en caso de que ocurra una división de cero, puede usar:

SELECT COALESCE(dividend / NULLIF(divisor,0), 0) FROM sometable

Por cada divisor que sea cero, obtendrá un cero en el conjunto de resultados.

Tobias Domhan avatar Jan 04 '2012 12:01 Tobias Domhan

Esta parecía ser la mejor solución para mi situación al intentar abordar la división por cero, lo que sucede en mis datos.

Supongamos que desea calcular la proporción entre hombres y mujeres para varios clubes escolares, pero descubre que la siguiente consulta falla y genera un error de división por cero cuando intenta calcular la proporción para el Club El Señor de los Anillos, que no tiene mujeres. :

SELECT club_id, males, females, males/females AS ratio
  FROM school_clubs;

Puedes utilizar la función NULLIFpara evitar la división por cero. NULLIFcompara dos expresiones y devuelve nulo si son iguales o la primera expresión en caso contrario.

Reescribe la consulta como:

SELECT club_id, males, females, males/NULLIF(females, 0) AS ratio
  FROM school_clubs;

Cualquier número dividido por NULLda NULLy no se genera ningún error.

frank avatar Dec 17 '2013 16:12 frank

También puedes hacer esto al comienzo de la consulta:

SET ARITHABORT OFF 
SET ANSI_WARNINGS OFF

Entonces, si tiene algo así, 100/0devolverá NULL. Solo he hecho esto para consultas simples, por lo que no sé cómo afectará a las más largas/complejas.

Taz avatar Jun 30 '2011 11:06 Taz