Database
 sql >> база данни >  >> RDS >> Database

Как да се справяме с разделяне на нула в SQL

Проблем:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите и маскирате PII в Elasticsearch

  2. Мигриране на данни с помощта на Network_link

  3. Как да получите текущата дата (без време) в T-SQL

  4. Как да използвате клауза HAVING в SQL

  5. Прагът за адаптивно присъединяване