Робота з NULL трапляється у найрізноманітніших сценаріях: від обробки відсутніх даних у звітах до фільтрації та сортування. Якби був вибір між відсутністю значення в таблиці і дивним числом типу 9999, більшість обрало б NULL — так, погоджуюсь, що це не найзручніше, але зате чесно. Давай розглянемо кілька типових кейсів.
Приклад: сортування товарів з відсутніми цінами
Уявімо, що ми керуємо інтернет-магазином, і у нас є таблиця товарів:
| product_id | name | price |
|---|---|---|
| 1 | Телефон | 45000 |
| 2 | Ноутбук | NULL |
| 3 | Камера | 25000 |
| 4 | Розумний годинник | NULL |
Ми хочемо відсортувати товари за ціною, при цьому товари без ціни (NULL) мають бути в кінці.
SELECT product_id, name, price
FROM products
ORDER BY price ASC NULLS LAST;
Результат:
| product_id | name | price |
|---|---|---|
| 3 | Камера | 25000 |
| 1 | Телефон | 45000 |
| 2 | Ноутбук | NULL |
| 4 | Розумний годинник | NULL |
Зверни увагу на ключову конструкцію NULLS LAST. За замовчуванням у PostgreSQL для ASC NULL значення йдуть на початок, але з цим параметром ми переносимо їх у кінець.
Приклад: фільтрація студентів без дати народження
У нас є таблиця студентів, і ми хочемо вибрати лише тих, у кого не вказана дата народження.
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
Запит:
SELECT student_id, name
FROM students
WHERE birth_date IS NULL;
Результат:
| student_id | name |
|---|---|
| 2 | Anna Song |
| 4 | Maria Chi |
Ми успішно витягнули інформацію про студентів, у яких дата народження невідома.
Приклади використання функцій для обробки NULL
Приклад: розрахунок підсумкової суми з урахуванням можливих NULL
У таблиці замовлень зберігаються суми замовлень. Але дані не завжди заповнені, і нам треба враховувати, що в таких випадках сума може бути 0.
Приклад даних:
| order_id | customer_name | order_amount |
|---|---|---|
| 1 | Alex | 1200 |
| 2 | Maria | 2500 |
| 3 | Max | NULL |
| 4 | Xena | 3100 |
Запит:
SELECT SUM(COALESCE(order_amount, 0)) AS total_amount
FROM orders;
Результат:
| total_amount |
|---|
| 6800 |
Ми використовуємо COALESCE(order_amount, 0), щоб замінити NULL на 0 перед підсумовуванням. Це дозволяє уникнути помилок або некоректних підрахунків.
Приклад: вивід тексту замість NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
У звіті треба вивести текст "Не вказано" для всіх порожніх даних замість NULL.
SELECT
customer_name,
COALESCE(order_amount::TEXT, 'Не вказано') AS order_status
FROM orders;
Результат:
| customer_name | order_status |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | Не вказано |
| Xena | 3100 |
COALESCE() дозволяє показати потрібний текст, якщо значення NULL.
Складні сценарії роботи з NULL
| customer_name | order_amount |
|---|---|
| Alex | 1200 |
| Maria | 2500 |
| Max | NULL |
| Xena | 3100 |
Наша задача — відсортувати замовлення так, щоб замовлення з відсутньою сумою були на початку, а далі — за спаданням від найбільшої суми до найменшої.
SELECT customer_name, order_amount
FROM orders
ORDER BY order_amount DESC NULLS FIRST;
Результат:
| customer_name | order_amount |
|---|---|
| Max | NULL |
| Xena | 3100 |
| Maria | 2500 |
| Alex | 1200 |
Тут ми використали NULLS FIRST, щоб розмістити NULL значення перед усіма іншими.
Приклад: фільтрація даних із заміною NULL значень
| student_id | name | birth_date |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | NULL |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | NULL |
У деяких звітах треба вивести лише ті рядки, де значення заповнене, або замінити його на "Невідомо", якщо воно NULL.
SELECT
student_id,
name,
COALESCE(birth_date::TEXT, 'Невідомо') AS birth_date_info
FROM students;
Результат:
| student_id | name | birth_date_info |
|---|---|---|
| 1 | Otto Art | 2000-01-15 |
| 2 | Anna Song | Невідомо |
| 3 | Alex Lin | 1999-05-10 |
| 4 | Maria Chi | Невідомо |
Це особливо корисно при складанні звітів, де важливо показати, що дані відсутні.
Практичні поради
Робота з NULL вимагає підвищеної уважності. Ось кілька корисних порад:
- Використовуй
IS NULLіCOALESCE()для перевірки та заміни відсутніх значень. - Пам’ятай, що агрегатні функції ігнорують
NULL, окрімCOUNT(*). - Для сортування пам’ятай про ключові слова
NULLS FIRSTіNULLS LAST. - У звітах завжди вказуй, як ти обробляєш
NULL, щоб уникнути непорозумінь із колегами.
Такі знання допоможуть тобі не лише писати правильні запити, а й справити враження на співбесіді. Бо вміння працювати з реальними даними завжди цінується більше, ніж просто теорія!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ