Проблем:
Искате да използвате израз 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' категория.