Выражение CASE в SQL: объяснение на примерах

Перевод статьи «SQL Case Statement Tutorial – With When-Then Clause Example Queries».

Выражение СASE — это, по сути, SQL-версия условной логики. Это выражение может использоваться примерно так же, как if-предложения в языках программирования вроде JavaScript, хотя его структура немного отличается.

Данные для примера

Представьте, что вы преподаете литературу в школе. ваши ученики должны написать сочинение.

Вы создали следующую таблицу, чтобы отслеживать, кто из учеников уже сдал сочинение (там же проставляются оценки). Если ученик еще не сдал сочинение, в графе оценок значится NULL.

STUDENT_IDNAMESUBMITTED_ESSAYGRADE
1ДжонTRUE86
2СаидTRUE90
3АлисаFALSENULL
4НойTRUE68
5ЭлеанорTRUE95
6АкикоFALSENULL
7ОттоTRUE76
8ДжамалTRUE85
9КьяраTRUE88
10КлементинаFALSENULL

Как написать выражение CASE в SQL

Допустим, вы хотели бы выводить ученикам сообщения о том, сдали они сочинение или нет. Чтобы получить статус каждого ученика, вы можете просто выбрать столбец submitted_essay, но тогда в сообщении будет только TRUE или FALSE, а это не очень читабельно.

Вместо этого вы можете использовать выражение CASE и вывоить разные сообщения, основываясь на статусе в submitted_essay.

Базовая структура выражения CASE:

CASE WHEN... THEN... END

Использование CASE WHEN, THEN и END является обязательным, а ELSE и AS — опцональным. Выражение СASE должно идти внутри инструкции SELECT.

SELECT name,
	CASE WHEN submitted_essay IS TRUE THEN 'сочинение сдано!'
	ELSE 'сдай сочинение!' END  AS status
FROM students;

В приведенном выше примере мы выбрали имена учеников, а затем вывели разные сообщения в столбце status, основываясь на значении submitted_essay. Результирующая таблица выглядит так:

NAMESTATUS
Акикосдай сочинение!
Клементинасдай сочинение!
Алисасдай сочинение!
Саидсочинение сдано!
Элеанорсочинение сдано!
Оттосочинение сдано!
Нойсочинение сдано!
Кьярасочинение сдано!
Джонсочинение сдано!
Джамалсочинение сдано!

Усложняем пример

Идем дальше. Допустим, вы хотели бы включить в сообщение побольше информации. Если ученик уже сдал сочинение, вы хотели бы добавить в сообщение его оценку, а если нет — напомнить, что сочинение еще не сдано. Здесь нам пригодятся предложения WHEN/THEN.

SELECT name, essay_grade,
CASE WHEN essay_grade >= 80 THEN 'молодец'
	 WHEN essay_grade < 80 THEN 'можешь лучше'
	 ELSE 'сдай сочинение!' END  AS teacher_comment
FROM students;

В этом примере кода мы вывели имена учеников, их оценки, а также комментарии, соответствующие оценкам.

После первого предложения WHEN/THEN вы можете добавить сколько угодно других WHEN/THEN, а также предложение ELSE, покрывающее все неучтенные случаи. Это аналог логики if... else if... else в JavaScript (или if... elif... else в Python и т. д.).

Обратите внимание, что в этом случае предложение ELSE призвано захватить все сочинения с оценками NULL (т. е. еще не сданные сочинения), но в других ситуациях для проверки, является ли значение null, вы могли бы использовать IS NULL.

Не забывайте ставить END в конце вашего CASE-выражения!

В таблице представлены результаты этого запроса:

NAMEESSAY_GRADETEACHER_COMMENT
АкикоNULLсдай сочинение!
КлементинаNULLсдай сочинение!
АлисаNULLсдай сочинение!
Саид90молодец
Элеанор95молодец
Отто76можешь лучше
Ной68можешь лучше
Кьяра88молодец
Джон86молодец
Джамал85молодец

Заключение

Выражения CASE легко понять и изучить. Их применение — это лаконичный способ внести ясность в ваши SQL-запросы.

[customscript]techrocks_custom_after_post_html[/customscript]

[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх