Problema:
Vorresti evitare l'errore di divisione per zero.
Esempio:
Il nostro database ha una tabella denominata numbers
con i dati nelle colonne id
, number_a
e number_b
.
id | numero_a | numero_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Dividiamo number_a
per number_b
e mostra la tabella con una nuova colonna, divided
, con il risultato della divisione.
Soluzione 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Soluzione 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Il risultato è:
id | numero_a | numero_b | diviso |
---|---|---|---|
1 | 4 | 0 | NULLO |
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
4 | -67 | 0 | NULLO |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Soluzione 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Il risultato è:
id | numero_a | numero_b | diviso |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Discussione:
La prima soluzione utilizza NULLIF()
funzione, che accetta due numeri come argomenti. Quando il primo argomento è uguale all'altro argomento, la funzione restituisce NULL
di conseguenza. Se number_b
è uguale a zero, il divisore è NULL
e il risultato della divisione è NULL
.
La seconda soluzione utilizza il CASE
dichiarazione. Se la condizione dopo il WHEN
la parola chiave è vera (nel nostro caso, la condizione è number_b = 0
), specifichiamo che NULL deve essere restituito. In caso contrario, la divisione avviene come al solito.
La terza soluzione usa semplicemente il WHERE
condizione per filtrare le righe in cui number_b
è zero. Le righe con number_b
uguale a zero mancano dal set di risultati.