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.