1. Оператор CASE

У мові SQL є два способи запису оператора CASE. Перший запис робить його схожим на switch із мови Java, а другий формат більше схожий на множинний if-else.

Почнемо з першого варіанта — аналога switch. Загальний формат має вигляд:


CASE case_value
WHEN value1 THEN result1
[WHEN value2 THEN result2] ...
[ELSE resultN]
END
        

Справді, дуже схожий на switch, тільки слова трохи інші:

SQL Java
case x switch (x) {
when value case value:
then result return result;
else result default: return result;
end }

Давай перекладемо приклад з Java на мову SQL:

Java SQL

switch (a) {
   case 1: return "one";
   case 2: return "two";
   case 3: return "three";
   default: return "unknown";
}

CASE a
   WHEN 1 THEN 'one'
   WHEN 2 THEN 'two'
   WHEN 3 THEN 'three'
   ELSE 'unknown'
END

2. Другий варіант оператора CASE

Також є другий варіант оператора CASE, який, як говорилося вище, більше схожий на множинний if-else. Загальний формат має вигляд:


CASE
WHEN умова1 THEN result1
[WHEN умова2 THEN result2] ...
[ELSE resultN]
END
        

Тут просто послідовно перевіряються умови, і якщо якась із них істинна, то повернеться зазначений результат. Якщо жодна з умов не буде істинною, тоді повернеться значення, вказане в ELSE.

Давай перекладемо приклад з Java на мову SQL:

Java SQL

if (a == 3)
return "three";

CASE
   WHEN a=3 THEN 'three'
END

if (a == 3)
return "three";
else
return "zero";

CASE
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END

if (a == 1)
return "three";
else if (a == 2)
return "two";
else if (a == 3)
return "three";
else
return "zero";

CASE
   WHEN a=1 THEN 'one'
   WHEN a=2 THEN 'two'
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END

3. Вирішуємо завдання за допомогою оператора CASE

Давай запишемо якийсь цікавий запит. Пам'ятаєш, у нас було завдання: додати слово "EXPIRED!" до назви завдань у таблиці task. Це можна легко зробити за допомогою оператора CASE.

Для поля deadline він виглядатиме як другий варіант оператора CASE:


CASE
WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name)
ELSE name
END
        

Приклад повного запиту за допомогою оператора CASE:


SELECT
    id,
    emploee_id,
    CASE WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name) ELSE name END AS name,
    deadline
FROM task
        

Результат цього запиту буде таким:

id emploee_id name deadline
1 1 EXPIRED! Виправити багу на фронтенді 2022-06-01
2 2 Виправити багу на бекенді 2022-06-15
3 5 Купити каву 2022-07-01
4 5 Купити каву 2022-08-01
5 5 Купити каву 2022-09-01
6 (NULL) Прибрати офіс (NULL)
7 4 Насолоджуватися життям (NULL)
8 6 Насолоджуватися життям (NULL)