Database
 sql >> Baza danych >  >> RDS >> Database

Jak napisać instrukcję CASE w SQL?

Problem:

Chcesz użyć instrukcji CASE w SQL.

Przykład:

Masz wyniki z egzaminu exam stół. Musisz przypisać każdy wynik do jednej z następujących wartości tekstowych:'bad result' , 'average result' lub 'good result' . Złe wyniki to te poniżej 40, dobre wyniki to te powyżej 70, a reszta to wyniki średnie.

exam tabela wygląda tak:

nazwa wynik
Toby Shaw 56
Casey Watson 49
Bennie Lynn 23
Wykorzystanie pasa ruchu 70
Steff Fox 85
Oddział Reggie 40
Gail Kennedy 66
Brice Mueller 90

Rozwiązanie 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;

Tabela wyników wygląda tak:

nazwa wynik kategoria
Toby Shaw 56 średni wynik
Casey Watson 49 średni wynik
Bennie Lynn 23 zły wynik
Wykorzystanie pasa ruchu 70 średni wynik
Steff Fox 85 dobry wynik
Oddział Reggie 40 średni wynik
Gail Kennedy 66 średni wynik
Brice Mueller 90 dobry wynik

Dyskusja:

Aby wyświetlić wartość na podstawie określonych warunków, musisz napisać CASE oświadczenie. Składnia to:

CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Jeśli condition_1 jest spełniony, to pobrana wartość to value_1 . Jeśli nie, baza danych sprawdza condition_2 . Jeśli condition_2 ma wartość true, to pobrana wartość to value_2 . Jeśli żaden z tych warunków nie jest spełniony, SQL sprawdza po kolei pozostałe warunki, aż do spełnienia jednego z warunków. Jeśli żaden z warunków nie jest spełniony, value_n określony po ELSE jest pobierany.

ELSE część jest opcjonalna. Jeśli go pominiesz i żaden z warunków nie zostanie spełniony, otrzymasz NULL .

Pamiętaj, aby END CASE klauzula, kiedy skończysz ze wszystkimi warunkami. Oczywiście, tak jak w przypadku każdej tworzonej kolumny, możesz zmienić jej nazwę (AS <column_name> ).

W naszym przykładzie 'bad result' jest przypisywana, gdy result < 40, and 'good result' jest przypisywana, gdy result > 70 . Jeśli żaden z tych warunków nie jest spełniony, wartością jest 'average result' . Ponadto, aby nazwać nowo utworzoną kolumnę wartości tekstowych, musisz użyć aliasu (AS Kategoria). W ten sposób otrzymujesz:

  CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result > 70 THEN 'good result'
    ELSE 'average result'
  END AS category

Ponieważ 'average result' jest przypisany do wyników między 40 i 70 (włącznie), możesz również napisać warunek zamiast ELSE (patrz Rozwiązanie 2 poniżej). Jednak łatwiej jest użyć ELSE .

Rozwiązanie 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;

Tabela wyników wygląda tak:

nazwa wynik kategoria
Toby Shaw 56 średni wynik
Casey Watson 49 średni wynik
Bennie Lynn 23 zły wynik
Wykorzystanie pasa ruchu 70 średni wynik
Steff Fox 85 dobry wynik
Oddział Reggie 40 średni wynik
Gail Kennedy 66 średni wynik
Brice Mueller 90 dobry wynik

Dyskusja:

Ponieważ 'average result' jest przypisany do wyników między 40 i 70 (włącznie), możesz wpisać następujący warunek zamiast ELSE :

WHEN result >= 40 AND result <= 70 THEN 'average result'

Jeśli nie używasz ELSE i nie chcę żadnych NULL s w category kolumna, musisz upewnić się, że zadbałeś o wszystkie możliwe result wartości. Jeśli istnieje result który nie spełnia żadnego z warunków, otrzymasz NULL .

Rozwiązanie 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;

Tabela wyników wygląda tak:

nazwa wynik kategoria
Toby Shaw 56 średni wynik
Casey Watson 49 średni wynik
Bennie Lynn 23 zły wynik
Wykorzystanie pasa ruchu 70 średni wynik
Steff Fox 85 dobry wynik
Oddział Reggie 40 średni wynik
Gail Kennedy 66 średni wynik
Brice Mueller 90 dobry wynik

Dyskusja:

Określone warunki w CASE może nie zachodzić na siebie jak w poprzednich rozwiązaniach lub nakładać się jak w tym rozwiązaniu. Pierwszy warunek jest taki sam jak poprzednio – dla result < 40 , category to 'bad result' . Wszystkie wyniki poniżej 40 mają przypisaną tę wartość w tym momencie i nie musisz już nic z nimi robić. Oznacza to, że nie ma potrzeby upewniania się, że result >= 40 w określaniu warunków dla 'average result' – wszystkie wyniki poniżej 40 mają już wartość 'bad result' przydzielony. Wreszcie, dla pozostałych wyników kategoria powinna być 'good result'; prosty ELSE 'good result' dba o to. W ten sposób otrzymujesz:

CASE
    WHEN result < 40 THEN 'bad result'
    WHEN result <= 70 THEN 'average result'
    ELSE 'good result'
END AS category

Uwaga:kolejność warunków w CASE sprawy. Jeśli odwrócisz kolejność pierwszych dwóch warunków (np. jeśli określisz WHEN result <= 70 THEN 'average result' najpierw WHEN result <= 70 THEN 'average result' po drugie), wszystkie wyniki mniejsze lub równe 70 trafić do 'average result' kategorii, bez wyników przypisanych do 'bad result' kategorii.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najbliższy mecz, część 2

  2. Jak używać klauzuli zbiorczego zbierania PL/SQL z instrukcją FETCH INTO?

  3. RDBMS a NoSQL

  4. Utwórz relację w SQL

  5. 4 gotowe metody konwersji danych SQL i przypadki użycia