602SQL-Úplná dokumentace Index  

Příkaz CASE (SQL)

příkaz_CASE ::= jednoduchý_příkaz_CASE | vyhledávací_příkaz_CASE
jednoduchý_příkaz_CASE ::= CASE výraz { WHEN výraz2 THEN příkaz… }… [ ELSE příkaz… ] END CASE;
vyhledávací_příkaz_CASE ::= CASE { WHEN podmínka THEN příkaz… }… [ ELSE příkaz… ] END CASE;

Příkaz CASE slouží k výběru a provedení jedné z několika možných posloupností příkazů. Jednotlivé posloupnosti jsou uvedeny ve větvích začínajících WHEN nebo ELSE.

jednoduchém příkazu CASE se hodnota výrazu hledá po řadě ve větvích mezi hodnotami výrazů2. Ve vyhledávacím příkazu CASE se po řadě hledá větev, v níž je podmínka splněná. Nalezne-li se taková větev, provedou se příkazy v této větvi následující za THEN.

Pokud není nalezena žádná vyhovující větev, pak obsahuje-li příkaz větev s ELSE, provedou se příkazy za ELSE. Jinak nastane chybový sqlstate 20000 (SQ_CASE_NOT_FOUND_STMT).

Dojde-li při provádění posloupnosti příkazů k chybě, pokračuje se dále v závislosti na dostupném handleru této chyby. Není-li nalezen CONTINUE handler, provádění příkazů v posloupnosti se ukončí.

Odlišnosti od normy

Příklad použití:

vyhledávací CASE (obdoba příkladu u IF)

TRIGGER befupd BEFORE UPDATE OF CISLO ON Tab3
REFERENCING NEW ROW AS novaradka
FOR EACH ROW
BEGIN
  CASE
    WHEN novaradka.cislo < 0 THEN
      SET novaradka.cislo=-novaradka.cislo;
  END CASE;
END

jednoduchý CASE

Změňte cenu u položek ceníku takto: položky ceníku začínající na X +10%, začínající na A +100%, ostatní smazat (obdoba příkladu u FOR)

PROCEDURE ZmenaCeniku();
BEGIN 
  FOR radek AS curcen SENSITIVE CURSOR FOR 
    SELECT id_pol, cena
    FROM Cenik
  DO 
    BEGIN
      CASE SUBSTRING(radek.id_pol FROM 1 FOR 1) 
        WHEN 'X' THEN 
          UPDATE  SET cena = cena*1.1 WHERE CURRENT OF curcen;
        WHEN 'A' THEN 
          UPDATE  SET cena = cena*2 WHERE CURRENT OF curcen;
        ELSE
          DELETE WHERE CURRENT OF curcen;
      END CASE;
    END;
  END FOR;
END;