¿Cómo evitar el error "dividir por cero" en SQL?
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 NULLIF
cláusula?
¿Existe una mejor manera o cómo se puede hacer cumplir?
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 "/".
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.
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 NULLIF
para evitar la división por cero. NULLIF
compara 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 NULL
da NULL
y no se genera ningún error.
También puedes hacer esto al comienzo de la consulta:
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
Entonces, si tiene algo así, 100/0
devolverá NULL. Solo he hecho esto para consultas simples, por lo que no sé cómo afectará a las más largas/complejas.