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.