Если вы хотите добавить какое-то значение в ячейку, и это зависит от некоторого условия, завязанного на других ячейках, то вам нужен SQL-оператор case.
Если вы знакомы с другими языками, то можно сказать, что оператор case – это тот же оператор if или switch. С его помощью вы можете указать значения для разных условий, так что вы можете получить различные значения в ячейке в зависимости от того, какое условие выполнится.
Этот оператор может быть очень полезен в анализе данных, так что после того, как мы ознакомимся с самим оператором case, мы рассмотрим пару примеров, как их можно использовать в анализе данных.
Синтаксис SQL-оператора case
Его синтаксис имеет довольно много нюансов, но при этом он интуитивно понятный: ключевое слово CASE свидетельствует о начале оператора case, а ключевое слово END - о его конце.
К тому же для отдельного условия вы можете записать ключевое слово WHEN, а после него условие, которое должно быть выполнено. Затем следует ключевое слово THEN и значение для этого условия, например, WHEN <условие> THEN <содержимое>.
Дальше могут следовать другие операторы WHEN/THEN.
В конце, после ключевого слова ELSE , вы можете добавить значение по умолчанию, которое будет использоваться только в том случае, если ни одно из условий не выполнится. Ниже приведен пример.
CASE
WHEN условие1 THEN содержимое
WHEN условие2 THEN другое содержимое
...
ELSE содержимое по умолчанию
END
Давайте реализуем это на практике, чтобы лучше понять.
Примеры с SQL-оператором case
Давайте применим оператор case на практике. У нас есть таблица со списком студентов и их экзаменационными баллами. Нам нужно поставить каждому студенту оценку. Мы можем сделать это автоматически, а для этого нам нужен оператор case.
id |
name |
score |
---|---|---|
1 |
Simisola |
60 |
2 |
Ivan |
80 |
3 |
Metodija |
52 |
4 |
Callum |
98 |
5 |
Leia |
84 |
6 |
Aparecida |
82 |
7 |
Ursula |
69 |
8 |
Ramazan |
78 |
9 |
Corona |
87 |
10 |
Alise |
57 |
11 |
Galadriel |
89 |
12 |
Merel |
99 |
13 |
Cherice |
55 |
14 |
Nithya |
81 |
15 |
El?ad |
71 |
16 |
Liisi |
90 |
17 |
Johanna |
90 |
18 |
Anfisa |
90 |
19 |
Ry?suke |
97 |
20 |
Sakchai |
61 |
21 |
Elbert |
63 |
22 |
Katelyn |
51 |
Воспользуемся оператором CASE для того, чтобы поставить каждому студенту оценку, которую мы добавим в новый столбец под названием grade.
Для начала запишем оператор CASE со схемой распределения оценок. Если значение score равно 94 и выше, то в строке записывается значение A. Если же значение score равно 90 и выше, то записывается значение A-, и т.д.
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END
После того, как мы написали оператор CASE, мы можем добавить его в запрос. После чего мы воспользуемся ключевым словом AS и дадим столбцу название grade:
SELECT *,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades;
Ниже представлена таблица, которую мы получим с помощью этого запроса. Теперь у каждого студента есть оценка, которая была выставлена в соответствии с его баллами.
id |
name |
score |
grade |
---|---|---|---|
1 |
Simisola |
60 |
D |
2 |
Ivan |
80 |
B- |
3 |
Metodija |
52 |
F |
4 |
Callum |
98 |
A |
5 |
Leia |
84 |
B |
6 |
Aparecida |
82 |
B- |
7 |
Ursula |
69 |
D+ |
8 |
Ramazan |
78 |
C+ |
9 |
Corona |
87 |
B+ |
10 |
Alise |
57 |
F |
11 |
Galadriel |
89 |
B+ |
12 |
Merel |
99 |
A |
13 |
Cherice |
55 |
F |
14 |
Nithya |
81 |
B- |
15 |
El?ad |
71 |
C- |
16 |
Liisi |
90 |
A- |
17 |
Johanna |
90 |
A- |
18 |
Anfisa |
90 |
A- |
19 |
Ry?suke |
97 |
A |
20 |
Sakchai |
61 |
D |
21 |
Elbert |
63 |
D |
22 |
Katelyn |
51 |
F |
Более сложные примеры с SQL-оператором case
Кроме того, мы можем производить различные действия с этой таблицей (зависит от того, что нам требуется) с помощью других операторов, которые используются совместно с оператором case.
Оператор case: пример 1
Например, мы можем воспользоваться оператором ORDER BY для того, чтобы отсортировать строки так, чтобы студенты с наивысшими оценками были на верхних строчках.
SELECT name,
CASE
WHEN score >= 94 THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade
FROM students_grades
ORDER BY score DESC;
Мы упорядочиваем строки, основываясь на столбце score, значения которого являются числами, а не на столбце grade, так как алфавитный порядок не совпадает с порядком числовых оценок. Для того, чтобы отобразить строки в порядке убывания, то есть так, чтобы наибольшие значения были наверху, мы используем ключевое слово DESC.
Таблица будет выглядеть следующим образом:
name |
grade |
---|---|
Merel |
A |
Callum |
A |
Ry?suke |
A |
Liisi |
A- |
Johanna |
A- |
Anfisa |
A- |
Galadriel |
B+ |
Corona |
B+ |
Leia |
B |
Aparecida |
B- |
Nithya |
B- |
Ivan |
B- |
Ramazan |
C+ |
El?ad |
C- |
Ursula |
D+ |
Elbert |
D |
Sakchai |
D |
Simisola |
D |
Alise |
F |
Cherice |
F |
Metodija |
F |
Katelyn |
F |
Оператор case: пример 2
Давайте немного проанализируем эти данные. Подсчитаем, сколько студентов получили каждую оценку. Для этого воспользуемся операторами GROUP BY и COUNT.
SELECT
CASE
WHEN score >= 94
THEN "A"
WHEN score >= 90 THEN "A-"
WHEN score >= 87 THEN "B+"
WHEN score >= 83 THEN "B"
WHEN score >= 80 THEN "B-"
WHEN score >= 77 THEN "C+"
WHEN score >= 73 THEN "C"
WHEN score >= 70 THEN "C-"
WHEN score >= 67 THEN "D+"
WHEN score >= 60 THEN "D"
ELSE "F"
END AS grade,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY grade
ORDER BY score DESC;
Мы используем оператор ORDER BY для того, чтобы упорядочить оценки в порядке убывания, и для этого мы используем столбец score, так как в нем хранятся числовые значения (а вот упорядочение по столбцу grade будет использовать алфавитный порядок, который не будет совпадать с порядком оценок, выстроенном по числовым значениям).
grade |
number_of_students |
---|---|
A |
3 |
A- |
3 |
B+ |
2 |
B |
1 |
B- |
3 |
C+ |
1 |
C- |
1 |
D+ |
1 |
D |
3 |
F |
4 |
Оператор case: пример 3
Давайте проанализируем данные немного по-другому. Мы воспользуемся операторами GROUP BY и COUNT, а также оператором case (но немного другим) для того, чтобы подсчитать, сколько студентов сдали экзамен. После чего мы можем применить оператор ORDER BY для того, чтобы расположить значения столбца с количеством студентов, успешно сдавших экзамен, в том порядке, который нам нужен.
SELECT
CASE
WHEN score >= 60
THEN "passed"
ELSE "failed"
END AS result,
COUNT(*) AS number_of_students
FROM students_grades
GROUP BY result
ORDER BY result DESC;
Вот так выглядит таблица, которую мы получили в результате. Не такая уж и плохая группа – 18 из 22 студентов сдали экзамен, а вот оставшимся 4 студентам может потребоваться помощь.
result |
number_of_students |
---|---|
passed |
18 |
failed |
4 |
Заключение
Оператор case – это мощный инструмент, который вы можете использовать тогда, когда вам нужно получить значения с учетом некоторых условий.
Из этой статьи вы узнали, как его можно применять, и рассмотрели несколько примеров из области анализа данных.