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.