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 WHENTHEN , 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.