Problema:
Le gustaría evitar el error de división por cero.
Ejemplo:
Nuestra base de datos tiene una tabla llamada numbers
con datos en las columnas id
, number_a
y number_b
.
id | número_a | número_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Dividamos number_a
por number_b
y mostrar la tabla con una nueva columna, divided
, con el resultado de la división.
Solución 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Solución 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
El resultado es:
id | número_a | número_b | dividido |
---|---|---|---|
1 | 4 | 0 | NULO |
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
4 | -67 | 0 | NULO |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2,0000 |
Solución 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
El resultado es:
id | número_a | número_b | dividido |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2,0000 |
Discusión:
La primera solución usa NULLIF()
función, que toma dos números como argumentos. Cuando el primer argumento es igual al otro argumento, la función devuelve NULL
como resultado. Si number_b
es igual a cero, el divisor es NULL
, y el resultado de la división es NULL
.
La segunda solución usa el CASE
declaración. Si la condición después de WHEN
palabra clave es verdadera (en nuestro caso, la condición es number_b = 0
), especificamos que se devuelva NULL. De lo contrario, la división ocurre como de costumbre.
La tercera solución simplemente usa WHERE
condición para filtrar las filas donde number_b
es cero Las filas con number_b
igual a cero faltan en el conjunto de resultados.