Проблем:
Искате да извършите деление във вашата 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
маса. Редовете, където приходите и разходите са равни, няма да се показват в крайния резултат.