sql >> Database teknologi >  >> RDS >> Database

Sådan skriver du en CASE-sætning i SQL

Problem:

Du vil bruge en CASE-sætning i SQL.

Eksempel:

Du har eksamensresultater i eksamen bord. Du skal tildele hvert resultat til en af ​​følgende tekstværdier:'dårligt resultat' , 'gennemsnitligt resultat' , eller 'godt resultat' . Dårlige resultater er dem under 40, gode resultater er dem over 70, og resten er gennemsnitlige resultater.

eksamenen tabellen ser sådan ud:

navn 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 sådan ud:

navn resultat kategori
Toby Shaw 56 gennemsnitligt resultat
Casey Watson 49 gennemsnitligt resultat
Bennie Lynn 23 dårligt resultat
Lane Sloan 70 gennemsnitligt resultat
Steff Fox 85 godt resultat
Reggie Ward 40 gennemsnitligt resultat
Gail Kennedy 66 gennemsnitligt resultat
Brice Mueller 90 godt resultat

Diskussion:

For at vise en værdi baseret på dine specifikke forhold, skal du skrive en CASE udmelding. Syntaksen er:

CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Hvis tilstand_1 er opfyldt, så er den hentede værdi value_1 . Hvis ikke, søger databasen efter condition_2 . Hvis tilstand_2 er sand, så er den hentede værdi value_2 . Hvis ingen af ​​disse betingelser er opfyldt, kontrollerer SQL for de resterende betingelser en efter en i rækkefølge, indtil en af ​​betingelserne er opfyldt. Hvis ingen af ​​betingelserne er opfyldt, er value_n angivet efter ELSE er hentet.

ELSE del er valgfri. Hvis du udelader det, og ingen af ​​betingelserne er opfyldt, får du en NULL .

Husk at END CASE klausul, når du er færdig med alle betingelserne. Som med enhver kolonne, du opretter, kan du selvfølgelig omdøbe den (AS ).

I vores eksempel, 'dårligt resultat' tildeles når resultat <40 og 'godt resultat' tildeles, når resultat> 70 . Hvis ingen af ​​disse betingelser er opfyldt, er værdien 'gennemsnitligt resultat' . For at navngive den nyoprettede kolonne med tekstværdierne skal du også bruge et alias (AS kategori). Sådan får du:

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

Siden 'gennemsnitligt resultat' er tildelt resultater mellem 40 og 70 (inklusive), kan du også skrive en betingelse i stedet for ELSE (se Løsning 2 nedenfor). Det er dog nemmere at bruge 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 sådan ud:

navn resultat kategori
Toby Shaw 56 gennemsnitligt resultat
Casey Watson 49 gennemsnitligt resultat
Bennie Lynn 23 dårligt resultat
Lane Sloan 70 gennemsnitligt resultat
Steff Fox 85 godt resultat
Reggie Ward 40 gennemsnitligt resultat
Gail Kennedy 66 gennemsnitligt resultat
Brice Mueller 90 godt resultat

Diskussion:

Siden 'gennemsnitligt resultat' er tildelt resultater mellem 40 og 70 (inklusive), kan du skrive følgende betingelse i stedet for en ELSE :

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

Hvis du ikke bruger en ELSE og ønsker ikke nogen NULL s i kategorien kolonne, skal du sørge for at tage dig af alle mulige resultater værdier. Hvis der er et resultat der ikke opfylder nogen af ​​betingelserne, 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 sådan ud:

navn resultat kategori
Toby Shaw 56 gennemsnitligt resultat
Casey Watson 49 gennemsnitligt resultat
Bennie Lynn 23 dårligt resultat
Lane Sloan 70 gennemsnitligt resultat
Steff Fox 85 godt resultat
Reggie Ward 40 gennemsnitligt resultat
Gail Kennedy 66 gennemsnitligt resultat
Brice Mueller 90 godt resultat

Diskussion:

De angivne betingelser i CASE kan være ikke-overlappende som i de tidligere løsninger eller overlappende som i denne løsning. Den første betingelse er den samme som før – for resultat <40 , kategorien er 'dårligt resultat' . Alle resultater under 40 er tildelt denne værdi på dette tidspunkt, og du behøver ikke at gøre noget med dem længere. Det betyder, at der ikke er behov for at sikre, at result>=40 ved at specificere betingelserne for 'gennemsnitsresultat' – alle resultater mindre end 40 har allerede værdien 'dårligt resultat' tildelt. Endelig skal kategorien for de resterende resultater være 'godt resultat'; et simpelt ELSE 'godt resultat' tager sig af det. Sådan får du:

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

Bemærk:Rækkefølgen af ​​betingelserne i CASE betyder noget. Hvis du vender om rækkefølgen af ​​de to første betingelser (dvs. hvis du angiver NÅR resultat <=70 SÅ 'gennemsnitligt resultat' først derefter HÅR resultat <=70 SÅ 'gennemsnitligt resultat' sekund), alle resultater mindre end eller lig med 70 ende i 'gennemsnitligt resultat' kategori, uden resultater tildelt 'dårligt resultat' kategori.


  1. Hvad er den tilsvarende PostgreSQL-syntaks til Oracles CONNECT BY ... START WITH?

  2. Benchmarking Managed PostgreSQL Cloud Solutions:Anden del - Amazon RDS

  3. Kun ét udtryk kan angives i valglisten, når underforespørgslen ikke er introduceret med EXISTS

  4. Hvad er use cases for at vælge CHAR frem for VARCHAR i SQL?