CASE je výraz (expression), který umožňuje aplikovat podmíněnou logiku v sql skritpu. Jde o logiku, kdy na základě podmínky (ve WHEN) vrátí hodnotu definovanou v THEN části. Existují 2 formy Simple CASE Expression (jednoduchá forma) a Searched CASE expression (forma pro vyhledávání).
Konstrukce: CASE obsahuje tyto kompomenty – CASE, WHEN, THEN, ELSE, END
- Začínáme příkazem CASE
- Následuje alespoň jedna dvojice WHEN/THEN příkazů (WHEN podmínka THEN hodnota);
- Příkaz ELSE je volitelný a poskytuje způsob, jak podchytit hodnoty, které nejsou uvedeny v části WHEN/THEN
- Příkaz END musí být na konci a ukončujeme tím výraz;
Pozn. Pokud není ELSE definováno je pro varianty, které nejsou uvedeny ve WHEN/THEN predikátech, je vrácena hodnota NULL
Syntaxe Simple SQL CASE formy:
SELECT
CASE Sloupec
WHEN 0 THEN 'No'
WHEN 1 THEN 'Yes'
ELSE 'N/A'
END AS Vysledky
FROM dbo.Tabulka;
Jednoduchá forma umožňuje hodnoty určitého sloupce porovnat proti nadefinovaným hodnotám a následně na základě těchto hodnot přiřadit výsledek. V tomto případě se porovnává sloupec “Sloupec”. Pokud je hodnota 0, je aktivována první WHEN/THEN a vrátí se “No”, pokud je 1 vrátí “Yes” a pokud není 1 ani 0 tak vrátí ‘N/A’.
Syntaxe Searched SQL CASE formy:
SELECT
CASE
WHEN ZnamkaNaVysvedceni BETWEEN 3 AND 5 OR (Predmet='Chovani' AND ZnamkaNaVysvedceni <>1) THEN 'Špatná známka'
WHEN ZnamkaNaVysvedceni >= 1 THEN 'Dobrá známka'
ELSE 'Neplatná hodnota. Známky na vysvědčení můzou být v rozsahu 1-5'
END AS Vysledky
FROM dbo.Vysvedceni;
Tato forma je oproti jednoduché formě více flexibilnější. Jednoduchá forma umožňuje porovnat hodnoty na základě rovnosti. Searched CASE forma umožňuje aplikovat podmínky pomocí operátorů. Použití CASE jsme ukázali na příkladu s vysvědčením. Pomocí konstrukce říkáme, že každá známka >=3 nebo známka z chování <>1 je špatná. Ostatní známky jsou dobré.
V jakých SQL klauzulích se dá použít?
- SELECT – podmíněnou logikou vrátíte nadefinované hodnoty
- WHERE – lze použít i k definování podmínky
- Agregace – výsledek můžete zabalit do agregačních funkcí
- GROUP BY – pokud definujete nějakou agregaci přes pole definované přes CASE, můžete umístit samotný case do GROUP BY
- ORDER – pomocí case lze teoreticky seřadit výsledky i když řazení je výkonově nárocně samo o sobě natož s použitím další CASE logiky, raději ne
A co dvojka na vysvědčení?
Dvojka je pořešená v druhé větvi WHEN ZnamkaNaVysvedceni >= 1 THEN ‘Dobrá známka’
Pěkně a velice srozumitelně vysvětlené.
Moc děkuji, hlavně za informace k čemu se CASE to používá a že není v selectu žádné IF/THEN.
Osobně mi přijdou hned první dvě věty článku o tom co příkaz vlastně dělá jako ty naprosto nejzásadnější informace,
které toho nejvíc říkají 🙂
Pěkné, srozumitelné, jen škoda, že příklad syntaxe Searched SQL CASE formy je lehce nesmysl (6 = dobrá známka) 😉
No, teoreticky. Ale očekáváme, že ve sloupci známka budou hodnoty od 1 do 5, což můžeme zajistit například přes trigger (při pokusu o vložení jiné známky odmítneme insert/update – SQL | Trigger v SQL Server – Definice, Typy, Syntaxe a Příklady.
Já bych ještě do vysvětlení doplnil, že příkaz CASE zpracovává pouze první vyhovující podmínku a případné další vyhovující již přeskakuje.