Problém:
Chtěli byste se vyhnout chybě dělení nulou.
Příklad:
Naše databáze má tabulku s názvem numbers
s údaji ve sloupcích id
, number_a
a number_b
.
id | číslo_a | číslo_b |
---|---|---|
1 | 4 | 0 |
2 | 57 | -5 |
3 | -7 | 56 |
4 | -67 | 0 |
5 | 23 | 55 |
6 | -8 | -4 |
Rozdělme number_a
podle number_b
a zobrazit tabulku s novým sloupcem, divided
, s výsledkem dělení.
Řešení 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Řešení 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Výsledek je:
id | číslo_a | číslo_b | rozděleno |
---|---|---|---|
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 |
Řešení 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Výsledek je:
id | číslo_a | číslo_b | rozděleno |
---|---|---|---|
2 | 57 | -5 | -11 4000 |
3 | -7 | 56 | -0,1250 |
5 | 23 | 55 | 0,4182 |
6 | -8 | -4 | 2 0000 |
Diskuse:
První řešení používá NULLIF()
funkce, která má dvě čísla jako argumenty. Když je první argument roven druhému argumentu, funkce vrátí NULL
jako výsledek. Pokud number_b
je roven nule, dělitel je NULL
a výsledek dělení je NULL
.
Druhé řešení používá CASE
prohlášení. Pokud je podmínka za WHEN
klíčové slovo je true (v našem případě je podmínkou number_b = 0
), určíme, že se má vrátit NULL. V opačném případě proběhne rozdělení jako obvykle.
Třetí řešení jednoduše používá WHERE
podmínkou pro odfiltrování řádků, kde je number_b
je nula. Řádky s number_b
v sadě výsledků chybí nula.