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

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

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

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

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

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

STUDENT_ID NAME SUBMITTED_ESSAY GRADE
1 Джон TRUE 86
2 Саид TRUE 90
3 Алиса FALSE NULL
4 Ной TRUE 68
5 Элеанор TRUE 95
6 Акико FALSE NULL
7 Отто TRUE 76
8 Джамал TRUE 85
9 Кьяра TRUE 88
10 Клементина FALSE NULL

Как написать выражение 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. Результирующая таблица выглядит так:

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

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

Идем дальше. Допустим. Вы хотели бы включить в сообщение побольше информации. Если ученик уже сдал сочинение, вы хотели бы добавить в сообщение его оценку. А если нет — напомнить. Что сочинение еще не сдано. Здесь нам пригодятся предложения 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-выражения!

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

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

Заключение

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