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.

V 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;