sql >> Databasteknik >  >> RDS >> Database

Hur man skriver en CASE-sats i SQL

Problem:

Du vill använda en CASE-sats i SQL.

Exempel:

Du har provresultat i testet tabell. Du måste tilldela varje resultat ett av följande textvärden:'dåligt resultat' , 'genomsnittligt resultat' , eller 'bra resultat' . Dåliga resultat är de under 40, bra resultat är de över 70, och resten är genomsnittliga resultat.

provet tabellen ser ut så här:

namn resultat
Toby Shaw 56
Casey Watson 49
Bennie Lynn 23
Lane Sloan 70
Steff Fox 85
Reggie Ward 40
Gail Kennedy 66
Brice Mueller 90

Lösning 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;

Resultattabellen ser ut så här:

namn resultat kategori
Toby Shaw 56 genomsnittligt resultat
Casey Watson 49 genomsnittligt resultat
Bennie Lynn 23 dåligt resultat
Lane Sloan 70 genomsnittligt resultat
Steff Fox 85 bra resultat
Reggie Ward 40 genomsnittligt resultat
Gail Kennedy 66 genomsnittligt resultat
Brice Mueller 90 bra resultat

Diskussion:

För att visa ett värde baserat på dina specifika villkor måste du skriva en CASE påstående. Syntaxen är:

CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Om condition_1 är uppfyllt, är det hämtade värdet value_1 . Om inte, kontrollerar databasen efter condition_2 . Om condition_2 är sant, är det hämtade värdet value_2 . Om inget av dessa villkor är uppfyllt, kontrollerar SQL efter de återstående villkoren en efter en tills ett av villkoren är uppfyllt. Om inget av villkoren är uppfyllt visas value_n specificeras efter ELSE hämtas.

ANELSE del är valfri. Om du utelämnar det och inget av villkoren är uppfyllt får du en NULL .

Kom ihåg att END CASE klausul när du är klar med alla villkor. Naturligtvis, som med alla kolumner du skapar, kan du byta namn på den (AS ).

I vårt exempel, 'dåligt resultat' tilldelas när resultat <40 och 'bra resultat' tilldelas när resultat> 70 . Om inget av dessa villkor är uppfyllt är värdet 'genomsnittligt resultat' . För att namnge den nyskapade kolumnen med textvärdena måste du också använda ett alias (AS kategori). Så här får du:

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

Eftersom 'genomsnittligt resultat' tilldelas resultat mellan 40 och 70 (inklusive), kan du också skriva ett villkor istället för ELSE (se Lösning 2 nedan). Det är dock lättare att använda ELSE .

Lösning 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;

Resultattabellen ser ut så här:

namn resultat kategori
Toby Shaw 56 genomsnittligt resultat
Casey Watson 49 genomsnittligt resultat
Bennie Lynn 23 dåligt resultat
Lane Sloan 70 genomsnittligt resultat
Steff Fox 85 bra resultat
Reggie Ward 40 genomsnittligt resultat
Gail Kennedy 66 genomsnittligt resultat
Brice Mueller 90 bra resultat

Diskussion:

Eftersom 'genomsnittligt resultat' tilldelas resultat mellan 40 och 70 (inklusive), kan du skriva följande villkor istället för en ANSÅ :

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

Om du inte använder en ELSE och vill inte ha någon NULL s i kategorin kolumnen måste du se till att du tar hand om alla möjliga resultat värden. Om det finns ett resultat som inte uppfyller något av villkoren får du en NULL .

Lösning 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;

Resultattabellen ser ut så här:

namn resultat kategori
Toby Shaw 56 genomsnittligt resultat
Casey Watson 49 genomsnittligt resultat
Bennie Lynn 23 dåligt resultat
Lane Sloan 70 genomsnittligt resultat
Steff Fox 85 bra resultat
Reggie Ward 40 genomsnittligt resultat
Gail Kennedy 66 genomsnittligt resultat
Brice Mueller 90 bra resultat

Diskussion:

De angivna villkoren i CASE kan vara icke-överlappande som i de tidigare lösningarna eller överlappande som i denna lösning. Det första villkoret är detsamma som tidigare – för resultat <40 , kategorin är 'dåligt resultat' . Alla resultat under 40 tilldelas detta värde vid det här laget och du behöver inte göra något med dem längre. Det betyder att du inte behöver se till att resultat>=40 genom att ange villkoren för 'genomsnittligt resultat' – alla resultat mindre än 40 har redan värdet 'dåligt resultat' tilldelas. Slutligen, för de återstående resultaten ska kategorin vara 'bra resultat'; ett enkelt ANS 'bra resultat' tar hand om det. Så här får du:

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

Obs:Ordningen på villkoren i CASE frågor. Om du byter ordning på de två första villkoren (dvs. om du anger NÄR resultat <=70 DÅ 'genomsnittligt resultat' först sedan NÄR resultat <=70 SEN 'medelresultat' sekund), alla resultat mindre än eller lika med 70 hamnar i 'genomsnittligt resultat' kategori, utan resultat tilldelade 'dåligt resultat' kategori.


  1. Lagrar Oracle efterföljande nollor för nummerdatatyp?

  2. Hur man skriver ut året när man formaterar ett datum i Oracle

  3. Använder Kubernetes för att distribuera PostgreSQL

  4. Distribuera Django + Python 3 + PostgreSQL till AWS Elastic Beanstalk