Problem:
Chcesz uniknąć błędu dzielenia przez zero.
Przykład:
Nasza baza danych zawiera tabelę o nazwie numbers z danymi w kolumnach id , number_a i number_b .
| id | numer_a | number_b |
|---|---|---|
| 1 | 4 | 0 |
| 2 | 57 | -5 |
| 3 | -7 | 56 |
| 4 | -67 | 0 |
| 5 | 23 | 55 |
| 6 | -8 | -4 |
Podzielmy number_a przez number_b i pokaż tabelę z nową kolumną, divided , z wynikiem dzielenia.
Rozwiązanie 1:
SELECT *, number_a / NULLIF(number_b, 0) AS divided FROM numbers;
Rozwiązanie 2:
SELECT *, CASE WHEN number_b = 0 THEN NULL ELSE number_a / number_b END AS divided FROM numbers;
Wynik:
| id | numer_a | number_b | podzielony |
|---|---|---|---|
| 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,000 |
Rozwiązanie 3:
SELECT *, number_a / number_b AS divided FROM numbers WHERE number_b != 0;
Wynik:
| id | numer_a | number_b | podzielony |
|---|---|---|---|
| 2 | 57 | -5 | -11.4000 |
| 3 | -7 | 56 | -0,1250 |
| 5 | 23 | 55 | 0.4182 |
| 6 | -8 | -4 | 2,000 |
Dyskusja:
Pierwsze rozwiązanie wykorzystuje NULLIF() funkcja, która przyjmuje jako argumenty dwie liczby. Gdy pierwszy argument jest równy drugiemu argumentowi, funkcja zwraca NULL w rezultacie. Jeśli number_b jest równy zero, dzielnik to NULL , a wynikiem dzielenia jest NULL .
Drugie rozwiązanie wykorzystuje CASE oświadczenie. Jeśli warunek po WHEN słowo kluczowe jest prawdziwe (w naszym przypadku warunek to number_b = 0 ), określamy, że zostanie zwrócone NULL. W przeciwnym razie podział przebiega jak zwykle.
Trzecie rozwiązanie po prostu używa WHERE warunek, aby odfiltrować wiersze, w których number_b wynosi zero. Wiersze z number_b w zestawie wyników brakuje wartości równej zero.