Перевод статьи «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]