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.