Problem:
Chcesz wykonać dzielenie w zapytaniu SQL, ale mianownik to wyrażenie, które może wynosić zero. Baza danych wyświetli błąd, gdy w rzeczywistości mianownik będzie wynosił zero.
Przykład:
Nasza baza danych zawiera tabelę o nazwie investor_data z danymi w następujących kolumnach:id , investor_year , price_per_share , income i expenses .
| id | rok_inwestora | price_per_share | dochód | wydatki |
|---|---|---|---|---|
| 1 | 2016 | 20 | 3200 | 2300 |
| 2 | 2017 | 130 | 2000 | 2000 |
| 3 | 2018 | 40 | 200 | 100 |
| 4 | 2019 | 15 | 5900 | 4900 |
Podzielmy cenę za akcję przez różnicę między przychodami a wydatkami, aby określić wskaźnik P/E (wskaźnik cena-zysk) dla każdego roku. Zauważ, że zdarzają się przypadki, gdy dochód równa się wydatkom, więc ich różnica będzie równa zeru. Dlatego musimy znaleźć sposób na uniknięcie dzielenia przez zero.
Rozwiązanie:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
To zapytanie zwraca wskaźnik P/E dla każdego roku, jak opisano w opisie problemu:
| rok_inwestora | P_E_ratio |
|---|---|
| 2016 | 0,0222 |
| 2017 | NULL |
| 2018 | 0.4000 |
| 2019 | 0.0150 |
Jeśli różnica między przychodami a wydatkami wynosi zero (jak w przypadku 2017), NULLIF funkcja zmienia zero na wartość NULL. Dlatego dzielenie przez zero daje wynik NULL.
Dyskusja:
Jeśli chcesz zgrabnie obsługiwać dzielenie przez zero, możesz użyć NULLIF funkcjonować. NULLIF przyjmuje dwa argumenty:wyrażenie zainteresowania i wartość, którą chcesz zastąpić. Jeśli pierwszy argument jest równy drugiemu, to NULLIF zwraca NULL; w przeciwnym razie zwraca pierwszy argument.
Możesz użyć tej funkcji do obsługi potencjalnego dzielenia przez zero poprzez zawinięcie mianownika w wywołaniu NULLIF . W naszym przykładzie, jeśli różnica między przychodami a wydatkami wynosi zero, ta wartość zostanie zmieniona na NULL, a mianownik w dzieleniu będzie NULL, a nie zero.
Rozwiązanie 2:Użyj WHERE
Oczywiście w niektórych sytuacjach możesz użyć prostszego rozwiązania:po prostu unikaj dzielenia przez zero, używając WHERE z operatorem porównania <>. W naszym przykładzie możemy sprawdzić, czy dochód-wydatki są różne od 0. Jeśli tak, obliczenia zostaną zwrócone.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Zauważ, że z WHERE rozwiązanie, otrzymasz mniej wierszy niż w investor_date stół. Wiersze, w których przychody i wydatki są równe, nie zostaną pokazane w wyniku końcowym.