Перевод статьи «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-запросы.
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]


