Nikdy nevíš, kdy to přijde
Zobrazit menu   MENU

23. Větvení kódu - podmínky a cykly

Větvení kódu se v MySQl může zdát trochu zvláštní, ale jsou situace kdy ho využijeme. Pod větvením kódu si můžeme představit to stejné, co známe z klasických programovacích jazyků, tedy zejména podmínky a cykly.

Podmínky v MySQL

Podmínky se vyskytují témeř v každém programovacím jazyce, není tedy třeba jejich logiku příliš vysvětlovat. MySQL nám nabízí buď pouze samotnou podmínku, možnost přidat blog ELSE nebo ELSEIF a při více možnostech využít CASE.


IF, ELSE, ELSEIF

Tyto klasické příkazy pro podmínky známe z programování. V MySQL je nejčastěji využijeme v triggerech nebo zejména uložených procedurách a uživatelsky definovaných funkcích, kde v podmínkách můžeme využít zadané parametry. Pěkným příkladem například může být procedura, která nám vrátí informace o filmu (tabulky jsme vytvářeli v díle o Uživatelsky definovaných funkcích) na základě názvu a pokud nenajde odpovídající záznam, vytvoří ho.

CREATE PROCEDURE ziskej_film (nazev_filmu varchar(100))
BEGIN
IF EXISTS(SELECT * FROM filmy WHERE nazev = nazev_filmu) THEN
SELECT * FROM filmy WHERE nazev = nazev_filmu;
ELSE
INSERT INTO filmy (nazev) VALUES (nazev_filmu);
SELECT * FROM filmy WHERE nazev = nazev_filmu;
END IF;
END


Jestli vám databáze vrátila chybu, jde o problém s oddělovačem, který je popsán v předchozích dílech. Pokud bychom potřebovali, můžeme přidat neomezený počet bloků ELSEIF, nebo celou část ELSE vynechat a něco provést pouze při splnění podmínky. V podmínce, která musí být splněna také můžeme používat AND nebo OR a závorkování stejným způsobem, na jaký jsme zvyklý z klauzule WHERE. Jak vidíme v předchozím příkladu, podmínka nemusí být statická, můžeme použít i dotaz:

Podmínka jako funkce

Specifickým případem podmínek je použítí IF jako funkce v SELECT dotazu. V tomto případě jde o obdobu ternárního operátoru. Tato funkce přijímá tři parametry, první je vyhodnocovaná podmínka. Pokud je platná, je vrácen druhý parametr, pokud platná není funkce vrací třetí zadaný parametr.

SELECT film_id, nazev, IF(hodnoceni > 7, 'dobry film', 'spatny film') AS textove_hodnoceni
FROM filmy


Větvení pomocí CASE

Větvení pomocí CASE nám neumožní proti konstrukci s IF nic navíc, ale v případě více podmínek může jít o přehlednější možnost. CASE postupně porovnává zadanou hodnotu a v případě shody vykoná určený kód. Pokud na žádnou shodu nenarazí, vykoná defaultní kód. Použít ho můžeme jak v procedurácg a triggerech, tak přímo v dotazu. V MySQL lze použít dve varianty zápisu. První je méně přehledná ale dokážeme složitější podmínky.

SELECT nazev,
CASE
WHEN hodnoceni > 9 THEN 'vyborne hodnoceni'
WHEN hodnoceni > 8 THEN 'nadprumerne hodnoceni'
WHEN hodnoceni > 5 THEN 'prumerne hodnoceni'
ELSE 'podprumerne hodnoceni'
END as textove_hodnoceni
FROM filmy


V druhé možnosti na začátku určíme co se bude porovnávat a poté již jen vypisujeme hodnoty k porovnání.

SELECT nazev,
CASE hodnoceni
WHEN 10 THEN 'maximalni hodnoceni'
WHEN 0 THEN 'minimalni hodnoceni'
ELSE 'jine hodnoceni'
END as textove_hodnoceni
FROM filmy


Cykly v MySQL

Cykly nám umožnují opakovaně vykonat nějaký kód. Oproti běžnému programování není jejich užití v MySQL tak časté, ale jsou případy kdy se mohou hodit. Cyklus vykonavá svůj kód dokud je platná zadaná podmínka. Vlastní podmínky zapisujeme stejným způsobem jako pro výše uvedené IF.

Stejně jako u podmínek, i zde můžeme využít několik druhů cyklů. První příkaz je cyklus REPEAT (možná znáte z pascalu). V programovacích jazycích založených na syntaxy jazyka C lze tento cyklus přerovnat k DO WHILE. Podmínka se tedy vyhodnuje až na konci, to znamená že kód cyklu se vždy provede minimálně jednou. Cyklus REPEAT zapíšeme takto:

REPEAT
samotný kód, který chceme vykonat
UNTIL podmínka
END REPEAT;


Druhý typ cyklu je klasický WHILE, kdy počet provedení závisí na splnění podmínky:

WHILE podmínka DO
samotný kód, který chceme vykonat
END WHILE;


Cykly a podmínky můžeme do sebe zanořovat a kombinovat. Často se takové používají s kombinací dočasných tabulek pro mezivýsledky.


Další díly tutoriálu

21. Triggery
22. Uživatelsky definované funkce
23. Větvení kódu - podmínky a cykly
24. Práce s datem a časem
25. Kódování řetezců