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.