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)
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0213
Напиши запрос, который согласно данных из поля is_full_time таблицы students вернет такую информацию: - 'true', если значение is_full_time равно 1 - 'false', если значение is_full_time равно 0 Используй CASE вида CASE case_value WHEN value1 THEN result1 ... FROM table
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0214
Напиши запрос, который согласно данных из поля experience таблицы developers вернет такую информацию: - 'junior', если значение experience менее 1 - 'middle', если значение experience менее 3 - 'senior', если значение experience менее 5 Используй CASE вида CASE WHEN condition
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0215
Напиши запрос, который согласно данных из поля number_of_season таблицы months вернет такую информацию: - 'winter', если значение number_of_season равно 1 - 'spring', если значение number_of_season равно 2 - 'summer', если значение number_of_season равно 3 - 'autumn',
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0216
Напиши запрос, который согласно данных из поля position таблицы employee вернет такую информацию: - 'yes', если значение position равно 'backend developer' - 'yes', если значение position равно 'frontend developer' - 'no', при любом другом значении position
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0217
Напиши запрос, который согласно данных из поля euro таблицы cars вернет такую информацию: - 'best', если значение euro больше 5 - 'good', если значение euro равно 5 - 'bad', при любом другом значении euro Результат ограничь 5 записями, отсортируй по цене (поле price), год вып
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0218
Напиши запрос, который согласно данных из поля euro таблицы cars вернет такую информацию: - 'best', если значение euro больше 5 - 'good', если значение euro равно 5 - 'bad', при любом другом значении euro Если значение euro равно NULL, то перед сравнением заменить его на 6.
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0219
Напиши запрос, который согласно данных из поля euro таблицы cars вернет такую информацию: - 'good', если значение euro равно NULL - 'bad', при любом другом значении euro Используй CASE WHEN ELSE
undefined
1
Задача
Модуль 4. Работа с БД, 2 уровень, 1 лекция
Недоступна
task0220
Напиши запрос, который согласно данных из поля prod_year таблицы cars вернет name и такую информацию: - 'new', если значение prod_year равно 2020 - 'newer', если значение prod_year равно 2021 - 'even newer', если значение prod_year равно 2022 В итоговой выборке не должно быть