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 |
|---|---|
|
|
2. Другий варіант оператора CASE
Також є другий варіант оператора CASE, який, як говорилося вище, більше схожий на множинний if-else. Загальний формат має вигляд:
CASE
WHEN умова1 THEN result1
[WHEN умова2 THEN result2] ...
[ELSE resultN]
END
Тут просто послідовно перевіряються умови, і якщо якась із них істинна, то повернеться зазначений результат. Якщо жодна з умов не буде істинною, тоді повернеться значення, вказане в ELSE.
Давай перекладемо приклад з Java на мову SQL:
| Java | SQL |
|---|---|
|
|
|
|
|
|
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) |
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ