sql >> Databáze >  >> RDS >> Database

Jak napsat příkaz CASE v SQL

Problém:

Chcete použít příkaz CASE v SQL.

Příklad:

Výsledky zkoušky máte v exam stůl. Každému výsledku musíte přiřadit jednu z následujících textových hodnot:'bad result' , 'average result' nebo 'good result' . Špatné výsledky jsou ty pod 40, dobré výsledky jsou ty nad 70 a zbytek jsou průměrné výsledky.

exam tabulka vypadá takto:

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

Řešení 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;

Výsledná tabulka vypadá takto:

name výsledek kategorie
Toby Shaw 56 průměrný výsledek
Casey Watson 49 průměrný výsledek
Bennie Lynn 23 špatný výsledek
Lane Sloan 70 průměrný výsledek
Steff Fox 85 dobrý výsledek
Reggie Ward 40 průměrný výsledek
Gail Kennedy 66 průměrný výsledek
Brice Mueller 90 dobrý výsledek

Diskuse:

Chcete-li zobrazit hodnotu na základě vašich konkrétních podmínek, musíte napsat CASE prohlášení. Syntaxe je:

CASE
  WHEN  THEN ,
  WHEN  THEN ,
  …
  ELSE 
END AS 

Pokud condition_1 je splněna, pak je načtená hodnota value_1 . Pokud ne, databáze zkontroluje condition_2 . Pokud condition_2 je true, pak načtená hodnota je value_2 . Pokud není splněna ani jedna z těchto podmínek, SQL kontroluje zbývající podmínky jednu po druhé, dokud není splněna jedna z podmínek. Pokud není splněna žádná z podmínek, value_n specifikované za ELSE je načteno.

ELSE část je volitelná. Pokud jej vynecháte a není splněna žádná z podmínek, dostanete NULL .

Nezapomeňte END CASE klauzule, když jste hotovi se všemi podmínkami. Samozřejmě, jako každý sloupec, který vytvoříte, jej můžete přejmenovat (AS <column_name> ).

V našem příkladu 'bad result' je přiřazeno, když result < 40, and 'good result' je přiřazeno, když result > 70 . Pokud není splněna ani jedna z těchto podmínek, hodnota je 'average result' . Chcete-li pojmenovat nově vytvořený sloupec textových hodnot, musíte použít alias (AS kategorie). Takto získáte:

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

Od 'average result' je přiřazen k výsledkům mezi 40 a 70 (včetně), můžete také napsat podmínku místo ELSE (viz Řešení 2 níže). Jednodušší je však použít ELSE .

Řešení 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;

Výsledná tabulka vypadá takto:

name výsledek kategorie
Toby Shaw 56 průměrný výsledek
Casey Watson 49 průměrný výsledek
Bennie Lynn 23 špatný výsledek
Lane Sloan 70 průměrný výsledek
Steff Fox 85 dobrý výsledek
Reggie Ward 40 průměrný výsledek
Gail Kennedy 66 průměrný výsledek
Brice Mueller 90 dobrý výsledek

Diskuse:

Od 'average result' je přiřazen k výsledkům mezi 40 a 70 (včetně), můžete místo ELSE napsat následující podmínku :

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

Pokud nepoužijete ELSE a nechcete žádné NULL s v category musíte se ujistit, že se staráte o všechny možné result hodnoty. Pokud existuje result který nesplňuje žádnou z podmínek, dostanete NULL .

Řešení 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;

Výsledná tabulka vypadá takto:

name výsledek kategorie
Toby Shaw 56 průměrný výsledek
Casey Watson 49 průměrný výsledek
Bennie Lynn 23 špatný výsledek
Lane Sloan 70 průměrný výsledek
Steff Fox 85 dobrý výsledek
Reggie Ward 40 průměrný výsledek
Gail Kennedy 66 průměrný výsledek
Brice Mueller 90 dobrý výsledek

Diskuse:

Zadané podmínky v CASE může být nepřekrývající se jako v předchozích řešeních nebo překrývající se jako v tomto řešení. První podmínka je stejná jako předtím – pro result < 40 , category je 'bad result' . Všechny výsledky pod 40 mají v tomto okamžiku přiřazenu tuto hodnotu a vy s nimi již nemusíte nic dělat. To znamená, že není třeba zajistit result >= 40 při specifikování podmínek pro 'average result' – všechny výsledky menší než 40 již mají hodnotu 'bad result' přiděleno. A konečně, pro zbývající výsledky by kategorie měla být 'good result'; jednoduchý ELSE 'good result' se o to stará. Takto získáte:

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

Poznámka:Pořadí podmínek v CASE záležitosti. Pokud obrátíte pořadí prvních dvou podmínek (tj. pokud zadáte WHEN result <= 70 THEN 'average result' nejprve WHEN result <= 70 THEN 'average result' za druhé), všechny výsledky jsou menší nebo rovné 70 skončí v 'average result' kategorii, bez přiřazení výsledků k 'bad result' kategorie.


  1. Jaký je nejrychlejší způsob hromadného vkládání velkého množství dat na SQL Server (klient C#)

  2. SQL Server SELECT, kde jakýkoli sloupec obsahuje 'x'

  3. Jak v SQL Server vygeneruji příkaz CREATE TABLE pro danou tabulku?

  4. Jak vytvořit navigační formulář v aplikaci Microsoft Access