Problem:
Du vill undvika division-med-noll-felet.
Exempel:
Vår databas har en tabell som heter numbers
med data i kolumnerna id
, number_a
och number_b
.
id | number_a | nummer_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Låt oss dela number_a
av number_b
och visa tabellen med en ny kolumn, divided
, med resultatet av divisionen.
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 är:
id | number_a | nummer_b | delad |
---|---|---|---|
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 är:
id | number_a | nummer_b | delad |
---|---|---|---|
2 | 57 | -5 | -11.4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2 0000 |
Diskussion:
Den första lösningen använder NULLIF()
funktion, som tar två tal som argument. När det första argumentet är lika med det andra argumentet returnerar funktionen NULL
som ett resultat. Om number_b
är lika med noll, är divisorn NULL
, och resultatet av divisionen är NULL
.
Den andra lösningen använder CASE
påstående. Om villkoret efter WHEN
nyckelordet är sant (i vårt fall är villkoret number_b = 0
), anger vi att NULL returneras. Annars sker uppdelningen som vanligt.
Den tredje lösningen använder helt enkelt WHERE
villkor för att filtrera bort raderna där number_b
är noll. Raderna med number_b
lika med noll saknas i resultatuppsättningen.