Probleem:
U wilt de deling-door-nul-fout vermijden.
Voorbeeld:
Onze database heeft een tabel met de naam numbers
met gegevens in de kolommen id
, number_a
, en number_b
.
id | nummer_a | number_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Laten we number_a
delen door number_b
en toon de tabel met een nieuwe kolom, divided
, met het resultaat van de deling.
Oplossing 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Oplossing 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Het resultaat is:
id | nummer_a | number_b | verdeeld |
---|---|---|---|
1 | 4 | 0 | NULL |
2 | 57 | -5 | -11.4.000 |
3 | -7 | 56 | -0.1250 |
4 | -67 | 0 | NULL |
5 | 23 | 55 | 0.4182 |
6 | -8 | -4 | 2.000 |
Oplossing 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Het resultaat is:
id | nummer_a | number_b | verdeeld |
---|---|---|---|
2 | 57 | -5 | -11.4.000 |
3 | -7 | 56 | -0.1250 |
5 | 23 | 55 | 0.4182 |
6 | -8 | -4 | 2.000 |
Discussie:
De eerste oplossing gebruikt de NULLIF()
functie, die twee getallen als argumenten nodig heeft. Als het eerste argument gelijk is aan het andere argument, retourneert de functie NULL
als gevolg. Als number_b
is gelijk aan nul, de deler is NULL
, en het resultaat van de deling is NULL
.
De tweede oplossing gebruikt de CASE
uitspraak. Als de voorwaarde na de WHEN
trefwoord is waar (in ons geval is de voorwaarde number_b = 0
), specificeren we dat NULL moet worden geretourneerd. Anders gebeurt de verdeling zoals gewoonlijk.
De derde oplossing gebruikt gewoon de WHERE
voorwaarde om de rijen uit te filteren waar number_b
nul is. De rijen met number_b
gelijk aan nul ontbreken in de resultatenset.