Проблем:
Искате да използвате израз CASE в SQL.
Пример:
Имате резултати от изпита в exam
маса. Трябва да присвоите всеки резултат на една от следните текстови стойности:'bad result'
, 'average result'
, или 'good result'
. Лошите резултати са тези под 40, добрите са тези над 70, а останалите са средни резултати.
exam
таблицата изглежда така:
name | резултат |
---|---|
Тоби Шоу | 56 |
Кейси Уотсън | 49 |
Бени Лин | 23 |
Лейн Слоун | 70 |
Стеф Фокс | 85 |
Реджи Уорд | 40 |
Гейл Кенеди | 66 |
Брис Мюлер | 90 |
Решение 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
Таблицата с резултатите изглежда така:
name | резултат | категория |
---|---|---|
Тоби Шоу | 56 | среден резултат |
Кейси Уотсън | 49 | среден резултат |
Бени Лин | 23 | лош резултат |
Лейн Слоун | 70 | среден резултат |
Стеф Фокс | 85 | добър резултат |
Реджи Уорд | 40 | среден резултат |
Гейл Кенеди | 66 | среден резултат |
Брис Мюлер | 90 | добър резултат |
Дискусия:
За да покажете стойност въз основа на вашето конкретно условие(а), трябва да напишете CASE
изявление. Синтаксисът е:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Ако condition_1
е изпълнено, тогава извлечената стойност е value_1
. Ако не, тогава базата данни проверява за condition_2
. Ако condition_2
е вярно, тогава извлечената стойност е value_2
. Ако нито едно от тези условия не е изпълнено, SQL проверява за останалите условия едно по едно, докато едно от условията не бъде изпълнено. Ако нито едно от условията не е изпълнено, value_n
посочено след ELSE
се извлича.
ELSE
частта е по избор. Ако го пропуснете и нито едно от условията не е изпълнено, получавате NULL
.
Не забравяйте да END
CASE
клауза, когато сте готови с всички условия. Разбира се, както при всяка колона, която създавате, можете да я преименувате (AS <column_name>
).
В нашия пример 'bad result'
се присвоява, когато result < 40, and 'good result'
се присвоява, когато result > 70
. Ако нито едно от тези условия не е изпълнено, стойността е 'average result'
. Също така, за да наименувате новосъздадената колона с текстовите стойности, трябва да използвате псевдоним (AS
категория). Ето как получавате:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Тъй като 'average result'
се присвоява на резултати между 40
и 70
(включително), можете също да напишете условие вместо ELSE
(вижте Решение 2 по-долу). Въпреки това е по-лесно да се използва ELSE
.
Решение 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
Таблицата с резултатите изглежда така:
name | резултат | категория |
---|---|---|
Тоби Шоу | 56 | среден резултат |
Кейси Уотсън | 49 | среден резултат |
Бени Лин | 23 | лош резултат |
Лейн Слоун | 70 | среден резултат |
Стеф Фокс | 85 | добър резултат |
Реджи Уорд | 40 | среден резултат |
Гейл Кенеди | 66 | среден резултат |
Брис Мюлер | 90 | добър резултат |
Дискусия:
Тъй като 'average result'
се присвоява на резултати между 40
и 70
(включително), можете да напишете следното условие вместо ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Ако не използвате ELSE
и не искам никакъв NULL
s в category
колона, трябва да сте сигурни, че сте се погрижили за всички възможни result
стойности. Ако има result
който не отговаря на нито едно от условията, получавате NULL
.
Решение 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
Таблицата с резултатите изглежда така:
name | резултат | категория |
---|---|---|
Тоби Шоу | 56 | среден резултат |
Кейси Уотсън | 49 | среден резултат |
Бени Лин | 23 | лош резултат |
Лейн Слоун | 70 | среден резултат |
Стеф Фокс | 85 | добър резултат |
Реджи Уорд | 40 | среден резултат |
Гейл Кенеди | 66 | среден резултат |
Брис Мюлер | 90 | добър резултат |
Дискусия:
Посочените условия в CASE
може да не се припокрива, както в предишните решения или да се припокрива, както в това решение. Първото условие е същото като преди – за result < 40
, category
е 'bad result'
. Всички резултати под 40
им е присвоена тази стойност в този момент и вече не е нужно да правите нищо с тях. Това означава, че няма нужда да се уверите, че result >= 40
при определяне на условията за 'average result'
– всички резултати под 40 вече имат стойността 'bad result'
назначен. И накрая, за останалите резултати категорията трябва да бъде 'good result'
; прост ELSE 'good result'
се грижи за това. Ето как получавате:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Забележка:Редът на условията в CASE
въпроси. Ако обърнете реда на първите две условия (т.е., ако посочите WHEN result <= 70 THEN 'average result'
първо, след това WHEN result <= 70 THEN 'average result'
второ), всички резултати по-малки или равни на 70
завършват в 'average result'
категория, без резултати, присвоени на 'bad result'
категория.