Database
 sql >> база данни >  >> RDS >> Database

Как да напишете изявление CASE в SQL

Проблем:

Искате да използвате израз 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
  WHEN  THEN ,
  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' категория.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заслужава ли си сертификатът за професионалист от Google Data Analytics?

  2. Свързване на F# към Salesforce.com

  3. SQL СЪЗДАВАНЕ НА ТАБЛИЦА... КАТО Инструкция SELECT

  4. Модел на данни за приложение за резервация на медицински срещи

  5. Прагове за оптимизиране – групиране и агрегиране на данни, част 1