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.