Давай поговоримо ще про одну функцію для роботи з загадковим NULL — NULLIF(). Вона допоможе нам у ситуаціях, коли певні значення треба замінити на NULL, щоб коректно обробляти дані. Пристібай ремені, це буде цікава подорож!
Функція NULLIF() — це крутий інструмент у PostgreSQL, який дозволяє тобі порівняти два значення і повернути NULL, якщо вони однакові, або повернути перше значення, якщо вони різні. Вона ніби каже: "Якщо ці значення однакові — забудь про них!"
Ось простий синтаксис функції:
NULLIF(value1, value2)
Якщо value1 і value2 однакові, результатом буде NULL. Якщо різні — результатом буде value1.
Приклад:
SELECT NULLIF(10, 10); -- Результат: NULL
SELECT NULLIF(10, 20); -- Результат: 10
SELECT NULLIF('hello', 'hello'); -- Результат: NULL
SELECT NULLIF('hello', 'world'); -- Результат: 'hello'
Просто, правда? Тепер давай спробуємо застосувати цю функцію в реальних задачах.
Приклад 1: Запобігання діленню на нуль
Ділення на нуль — це жах для будь-якого програміста. В SQL спроба поділити на нуль видасть помилку. Ось тут і виручає NULLIF().
Уяви ситуацію: у нас є таблиця sales з двома стовпцями: revenue (дохід) і expenses (витрати). Ми хочемо порахувати рентабельність витрат (revenue / expenses), але іноді витрати дорівнюють нулю. Якщо просто виконати запит без перевірки — отримаємо помилку ділення на нуль.
Таблиця sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Помилковий запит:
SELECT revenue / expenses AS profitability
FROM sales;
-- Помилка: ділення на нуль!
Рішення з NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Результат:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Тепер, якщо expenses дорівнює 0, NULLIF(expenses, 0) повертає NULL, а ділення на NULL не викликає помилки, а просто повертає NULL.
Приклад 2: Заміна однакових значень на NULL
Уяви, що у тебе є таблиця з даними про студентів, де є стовпці first_name і preferred_name. Іноді студенти хочуть використовувати своє справжнє ім'я, а іноді обирають щось інше. Якщо обидва імені однакові — немає сенсу показувати preferred_name.
Таблиця students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Запит з NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Результат:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Коли preferred_name і first_name однакові, результатом буде NULL.
Приклад 3: Фільтрація даних
Іноді треба вибрати лише ті рядки, де значення у двох стовпцях різні. Наприклад, у нас є таблиця замовлень з original_price і discounted_price. Треба знайти замовлення, де була знижка.
Таблиця orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Запит з NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Результат:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Тільки замовлення зі знижкою потрапили в результат.
Практичні кейси використання NULLIF()
Кейс 1: Вибір опціонального значення
Працюючи з даними, іноді треба вибрати значення з кількох стовпців, ігноруючи ті, що дорівнюють певному значенню. Наприклад, у нас є список співробітників з їх зарплатами: base_salary і bonus. Якщо бонус дорівнює 0, ми хочемо встановити його в 999.
Таблиця employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Запит з NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Результат:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Якщо bonus дорівнює 0, він перетвориться на 999.
Кейс 2: Підрахунок рядків
Можна використовувати NULLIF() для спрощення складних умов фільтрації. Наприклад, у нас є таблиця користувачів і ми хочемо одним запитом дізнатися і їх загальну кількість, і кількість зареєстрованих користувачів (без статусу guest).
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
Ось так, за допомогою всього однієї функції NULLIF() можна вирішити купу задач: від запобігання помилкам до простого покращення читабельності коду. Тепер, коли ти знаєш, як вона працює, ти вже на крок ближче до майстерності в роботі з даними у PostgreSQL.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ