Проблем:
Искате да извършите деление във вашата SQL заявка, но знаменателят е израз, който може да бъде нула. Базата данни ще ви даде грешка, когато знаменателят всъщност е нула.
Пример:
Нашата база данни има таблица с име investor_data с данни в следните колони:id , investor_year , price_per_share , income , и expenses .
| id | инвеститор_година | цена_на_акция | доход | разходи |
|---|---|---|---|---|
| 1 | 2016 | 20 | 3200 | 2300 |
| 2 | 2017 | 130 | 2000 | 2000 |
| 3 | 2018 | 40 | 200 | 100 |
| 4 | 2019 | 15 | 5900 | 4900 |
Нека разделим цената на акция на разликата между приходите и разходите, за да определим съотношението P/E (съотношение цена-печалба) за всяка година. Забележете, че има случаи, когато приходите са равни на разходите, така че разликата им ще бъде нула. Следователно трябва да намерим начин да избегнем деленето на нула.
Решение:
SELECT investor_year, price_per_share/NULLIF(income-expenses, 0) AS P_E_ratio FROM investor data;
Тази заявка връща съотношението P/E за всяка година, както е описано в изложението на проблема:
| година_инвеститор | P_E_ratio |
|---|---|
| 2016 | 0,0222 |
| 2017 | NULL |
| 2018 | 0,4000 |
| 2019 | 0,0150 |
Ако разликата между приходите и разходите е нула (какъвто е случаят за 2017 г.), NULLIF функцията променя нулата на стойност NULL. Следователно, разделянето на нула ви дава NULL в резултата.
Дискусия:
Ако искате да се справите с деленето на нула грациозно, можете да използвате NULLIF функция. NULLIF приема два аргумента:израза на интерес и стойността, която искате да замените. Ако първият аргумент е равен на втория, тогава NULLIF връща NULL; в противен случай връща първия аргумент.
Можете да използвате тази функция за обработка на потенциално деление на нула, като обвиете знаменателя в извикване на NULLIF . В нашия пример, ако разликата между приходите и разходите е нула, тази стойност ще бъде променена на NULL, а знаменателят в делението ще бъде NULL, а не нула.
Решение 2:Използвайте WHERE
Разбира се, в някои ситуации можете да използвате по-просто решение:Просто избягвайте деление на нула, като използвате WHERE с оператора за сравнение <>. В нашия пример можем да проверим дали приходи-разходи са различни от 0. Ако е така, изчислението ще бъде върнато.
SELECT investor_year, price_per_share/(income-expenses) AS P_E_ratio FROM investor data WHERE (income-expenses) <> 0 ;
Имайте предвид, че с WHERE решение, ще получите по-малко редове, отколкото има в investor_date маса. Редовете, където приходите и разходите са равни, няма да се показват в крайния резултат.