JavaRush /Курси /SQL SELF /Умовні вирази: CASE <вираз> WHEN ... THEN .....

Умовні вирази: CASE <вираз> WHEN ... THEN ... ELSE ... END

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

Якщо ти вже знайомий з 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 — твій інструмент, щоб цю ясність зробити реальною.

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