Якщо ти вже знайомий з CASE, способом вбудовувати логіку прямо в запит. Але не всі знають, що у CASE є дві форми. Якщо CASE WHEN ... — це перевірка умов типу if-else, то простий CASE — це як switch-case з інших мов: він порівнює один вираз з кількома значеннями і виконує відповідний блок.
Виглядає компактніше і інтуїтивніше, коли ти порівнюєш одне поле з фіксованими значеннями.
Синтаксис простого CASE
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Все просто:
expression— це вираз або поле, яке порівнюється зі значеннямиvalue1,value2і т.д.THENвказує, що повернути при збігу.ELSE— що повернути, якщо нічого не підійшло (можна пропустити, але краще не треба).
Приклад: Оцінки студентів
Уявімо таблицю students зі стовпцем grade, який містить ціле число від 2 до 5. Ми хочемо показати текстову інтерпретацію оцінок.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Відмінно'
WHEN 4 THEN 'Добре'
WHEN 3 THEN 'Задовільно'
WHEN 2 THEN 'Незадовільно'
ELSE 'Невідомо'
END AS оцінка_словами
FROM students;
Тут CASE порівнює значення поля grade з фіксованими значеннями 2, 3, 4, 5.
Приклад: Категорії товарів за кодом
У таблиці products є поле category_code, де лежать короткі мітки: 'el', 'frn', 'bks' і т.д. Ми хочемо показати читабельну назву категорії.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Електроніка'
WHEN 'frn' THEN 'Меблі'
WHEN 'bks' THEN 'Книги'
ELSE 'Інше'
END AS category_name
FROM products;
Цей прийом особливо зручний, коли треба показувати "людський" текст замість коду.
Приклад: Назви місяців
Іноді хочеться показати назви місяців у вигляді тексту за номером:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Січень'
WHEN 2 THEN 'Лютий'
WHEN 3 THEN 'Березень'
WHEN 4 THEN 'Квітень'
WHEN 5 THEN 'Травень'
WHEN 6 THEN 'Червень'
WHEN 7 THEN 'Липень'
WHEN 8 THEN 'Серпень'
WHEN 9 THEN 'Вересень'
WHEN 10 THEN 'Жовтень'
WHEN 11 THEN 'Листопад'
WHEN 12 THEN 'Грудень'
ELSE 'Невідомо'
END AS month_name
FROM orders;
Тут простий CASE робить зрозумілим те, що інакше виглядало б як числа від 1 до 12.
Робота з NULL у простому CASE
Важливо розуміти, що якщо значення порівнюється з NULL, то результат буде NULL, бо NULL = NULL — це не істина, а невідомо.
Приклад з NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Активний'
WHEN 'blocked' THEN 'Заблокований'
WHEN NULL THEN 'Немає статусу' -- не спрацює!
ELSE 'Невідомо'
END AS user_state
FROM users;
Замість WHEN NULL треба використовувати ELSE, або просто застосувати пошуковий CASE (який ми розбирали в минулій лекції):
CASE
WHEN status IS NULL THEN 'Немає статусу'
...
Порівняння з пошуковим CASE
| Особливість | Простий CASE | Пошуковий CASE |
|---|---|---|
| Порівняння з конкретними значеннями | ✅ Зручно | ❌ Не підходить |
| Гнучкість умов (>, IS NULL) | ❌ Не можна | ✅ Можна |
| Аналог у програмуванні | switch-case |
if-else |
Практичні кейси
Приклад: Візуалізація статусу заявки
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Нова'
WHEN 'in_progress' THEN '🔵 В роботі'
WHEN 'done' THEN '🟢 Завершена'
ELSE '⚪ Невідомо'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Нова |
| 102 | 🔵 В роботі |
| 103 | 🟢 Завершена |
| 104 | ⚪ Невідомо |
| 105 | ⚪ Невідомо |
Тут CASE працює як перекладач: перетворює технічні статуси у зрозумілі (і навіть симпатичні) мітки. І якщо статус невідомий або NULL — користувач отримає ⚪ «Невідомо».
Приклад: Групування за категоріями для звіту
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Кадри'
WHEN 'IT' THEN 'Технології'
WHEN 'FIN' THEN 'Фінанси'
ELSE 'Інше'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Кадри'
WHEN 'IT' THEN 'Технології'
WHEN 'FIN' THEN 'Фінанси'
ELSE 'Інше'
END;
Результат:
| dept_name | staff_count |
|---|---|
| Кадри | 3 |
| Технології | 3 |
| Фінанси | 2 |
| Інше | 2 |
Що тут відбувається:
- Працівники з департаменту HR потрапляють у категорію Кадри.
- IT — це Технології.
- FIN — це Фінанси.
- Все інше, включаючи SALES і NULL, потрапляє в Інше. Такий підхід ідеально підходить для створення дружніх і зрозумілих звітів.
Поширені помилки
- Забув
ELSE→ отримуєшNULL, якщо жодне значення не збіглося. - Порівнюєш з
NULL→ не працює, використовуйIS NULLі пошуковийCASE. - Порівнюєш несумісні типи → наприклад,
CASE grade WHEN '5'якщоgradeчисловий тип.
Простий CASE — це твій інструмент, коли треба порівняти одне значення з набором можливих. Він компактний, читабельний і особливо корисний для текстової класифікації, візуалізації, перетворення кодів і зручного групування.
Якщо ж треба перевіряти діапазони, NULL, або складніші умови — бери пошуковий CASE. SQL любить ясність. А CASE — твій інструмент, щоб цю ясність зробити реальною.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ