Problem:
Du vil gerne undgå division-ved-nul-fejlen.
Eksempel:
Vores database har en tabel ved navn numbers
med data i kolonnerne id
, number_a
og number_b
.
id | nummer_a | nummer_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Lad os dividere number_a
efter number_b
og vis tabellen med en ny kolonne, divided
, med resultatet af delingen.
Løsning 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Løsning 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Resultatet er:
id | nummer_a | nummer_b | delt |
---|---|---|---|
1 | 4 | 0 | NULL |
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
4 | -67 | 0 | NULL |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Løsning 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Resultatet er:
id | nummer_a | nummer_b | delt |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2.0000 |
Diskussion:
Den første løsning bruger NULLIF()
funktion, som tager to tal som argumenter. Når det første argument er lig med det andet argument, returnerer funktionen NULL
som resultat. Hvis number_b
er lig med nul, er divisor NULL
, og resultatet af divisionen er NULL
.
Den anden løsning bruger CASE
udmelding. Hvis betingelsen efter WHEN
søgeordet er sandt (i vores tilfælde er betingelsen number_b = 0
), angiver vi, at NULL returneres. Ellers sker opdelingen som normalt.
Den tredje løsning bruger simpelthen WHERE
betingelse for at bortfiltrere rækkerne hvor number_b
er nul. Rækkerne med number_b
lig med nul mangler i resultatsættet.