JavaRush /Курси /SQL SELF /Обробка NULL у розрахунках з COALESCE()

Обробка NULL у розрахунках з COALESCE()

SQL SELF
Рівень 9 , Лекція 3
Відкрита

Сьогодні ми знову зануримось у тему обробки NULL і познайомимось з дуже корисною функцією — COALESCE(). Ця функція дозволяє елегантно справлятися з NULL значеннями у твоїх даних.

Розглянемо наступний приклад: у тебе є таблиця з даними про співробітників, але в деяких співробітників відсутня інформація про зарплату. Що буде, якщо ми спробуємо підвищити всім зарплати? Нічого доброго. Бо не можна проводити операції з NULL. А якщо ми хочемо замінити NULL зарплати на, скажімо, 0? Тут на сцену виходить COALESCE().

COALESCE() — це функція, яка повертає перше не-NULL значення з переданого списку аргументів. Якщо всі значення у списку дорівнюють NULL, функція повертає NULL. Простими словами, вона каже: "Дайте мені перше адекватне значення, яке ви можете знайти, будь ласка!"

Синтаксис

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_n — це аргументи, які ти передаєш функції. Вона поверне перше значення, яке не дорівнює NULL.

Приклади роботи COALESCE()

Наведемо парочку прикладів.

Приклад 1: Замінюємо NULL на 0

Припустимо, у нас є таблиця salaries:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

Ми хочемо порахувати загальну суму зарплат - це просто зробити:

SELECT SUM(salary) AS total_salary
FROM salaries;

Функція SUM() ігнорує NULL, тож проблем немає.

Але потім ми хочемо порахувати загальну суму зарплат, якщо ми дамо кожному співробітнику премію у 1000.

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

І результат починає "плисти". Краще одразу позбутися NULL значень за допомогою функції COALESCE і замінити їх на 0. Дивимось, як це зробити:

SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;

Результат:

total_salary
110000

Так краще і надійніше.

Приклад 2: Замінюємо NULL на значення за замовчуванням

Допустимо, у нас є таблиця students з іменами та адресами:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

Ми хочемо замінити NULL в адресах на "Не вказано":

SELECT name, COALESCE(address, 'Не вказано') AS resolved_address
FROM students;

Результат запиту:

name resolved_address
Anna Kanne
Peter Не вказано
Lisa Painful
Alex Не вказано

Приклад 3: Використання декількох значень

Іноді буває, що NULL треба замінити не одним значенням, а цілим рядом значень. Наприклад, ми хочемо вибирати ім'я, ім'я для друзів або використовувати "Без імені", якщо жодне з них не задано. Таблиця users:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

Запит:

SELECT user_id,
       COALESCE(first_name, short_name, 'Без імені') AS display_name
FROM users;

Результат:

user_id display_name
1 John
2 Pete
3 Без імені

Практичне застосування COALESCE()

На практиці COALESCE() — це рятівний круг для роботи з неідеальними даними.

Дивимось, як він допомагає у різних задачах.

Приклад 1: Заміна значень у текстових полях

Початкова таблиця customers:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

Запит:

SELECT name, COALESCE(address, 'Не вказано') AS address
FROM customers;

Результат:

name address
Alex Lin 123 Maple St
Maria Chi Не вказано
Anna Song 456 Oak Ave
Otto Art Не вказано
Liam Park 789 Pine Rd

Приклад 2: Підготовка даних для звітів

Початкова таблиця sales:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

Запит:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

Результат:

total_sales
650

Типові помилки при використанні COALESCE()

Хоч COALESCE() здається простою і універсальною функцією, з нею можна зіткнутися з кількома підводними каменями.

Невідповідність типів даних. Всі аргументи, які передаються у COALESCE(), мають бути сумісні за типом даних. Наприклад, не можна змішувати рядкові значення і числові.

-- Помилка
SELECT COALESCE(salary, 'Не вказано') FROM employees; 
-- salary — числове поле, а 'Не вказано' — текст.

Ігнорування порядку аргументів. COALESCE() повертає перше не-NULL значення, тому порядок аргументів має велике значення.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ