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.

Dojde-li p°i provßd∞nφ posloupnosti p°φkaz∙v²jimce, pokraΦuje se dßle v zßvislosti na dostupnΘm handleru tΘto v²jimky. 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%, zaΦφnajφcφ na B smazat (obdoba p°φkladu u FOR)

PROCEDURE ZmenaCeniku();
BEGIN 
  FOR radek AS curcen SENSITIVE CURSOR FOR 
    SELECT cislo_pol, cena
    FROM Cenik
  DO 
    BEGIN
      CASE SUBSTRING(radek.cislo_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;