2.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.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

2.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)