Die CASE-Anweisung führt SQL-Anweisungen abhängig von bestimmten Werten (einfache CASE-Anweisung) oder Bedingungen (CASE-Anweisung mit Suchbedingung) aus.
Die CASE-Anweisung darf nur in einer Routine angegeben werden, d.h. im Rahmen einer CREATE PROCEDURE- oder CREATE FUNCTION-Anweisung. Routinen und ihre Verwendung in SESAM/SQL sind detailliert im Kapitel „Routinen" beschrieben.
Die CASE-Anweisung ist eine nicht-atomare SQL-Anweisung, d.h. in ihr können weitere (atomare oder nicht-atomare) SQL-Anweisungen auftreten.
Wenn die suchbedingung oder ein ausdruck einer CASE-Anweisung eine Tabelle anspricht, dann muss der Berechtigungsschlüssel, der die Routine mit CREATE PROCEDURE oder CREATE FUNCTION erzeugt, das SELECT-Privileg für diese Tabelle besitzen.
Ausführungshinweise
Die CASE-Anweisung ist eine nicht-atomare Anweisung:
Wenn die CASE-Anweisung Teil einer COMPOUND-Anweisung ist, dann gelten die dort beschriebenen Regeln, insbesondere die dort definierten Fehler-Routinen.
Wenn die CASE-Anweisung nicht Teil einer COMPOUND-Anweisung ist und eine der SQL-Anweisungen einen SQLSTATE meldet, dann werden ggf. nur die Änderungen dieser SQL-Anweisung rückgängig gemacht. Die CASE-Anweisung und die Routine, in der sie enthalten ist, werden abgebrochen. Die SQL-Anweisung, in der die Routine verwendet wurde, liefert den betreffenden SQLSTATE zurück.
Siehe auch
CREATE PROCEDURE, CREATE FUNCTION
Format der einfachen CASE-Anweisung
CASE
ausdruckx
WHEN
ausdruck1 , ... THEN
routine_sql_anweisung; [
routine_sql_anweisung; ] ...
...
[ ELSE
routine_sql_anweisung; [
routine_sql_anweisung; ] ... ]
END CASE
ausdruck
Ausdruck, dessen Auswertung einen alphanumerischen Wert, einen National-Wert, einen numerischen Wert oder einen Zeitwert ergibt.
Es darf kein multipler Wert mit Dimension > 1 sein.
ausdruck darf keine Benutzervariable enthalten.
Eine Spalte darf nur in einer Unterabfrage angegeben werden.
Die Werte von ausdruckx und ausdruck1, ... müssen verträgliche Datentypen haben (siehe Abschnitt „Verträglichkeit von Datentypen").
routine_sql_anweisung
SQL-Anweisung, die in der THEN- oder ELSE-Klausel in Abhängigkeit von den Werten von ausdruckx und ausdruck1, ... ausgeführt werden soll.
Eine SQL-Anweisung wird mit „;“ (Semikolon) abgeschlossen.
Mehrere SQL-Anweisungen können nacheinander angegeben werden. Sie werden in der angegebenen Reihenfolge ausgeführt.
Vor der Durchführung einer SQL-Anweisung werden keine Privilegien geprüft.Eine SQL-Anweisung in einer Routine darf auf die Parameter der Routine und (wenn die Anweisung Teil einer COMPOUND-Anweisung ist) auf lokale Variablen, jedoch nicht auf Benutzervariablen zugreifen.
Syntax und Bedeutung von routine_sql_anweisung sind zentral im Abschnitt „SQL-Anweisungen in Routinen" beschrieben. Die dort genannten SQL-Anweisungen dürfen verwendet werden.
Ausführungshinweise
Der ausdruckx der CASE-Anweisung wird berechnet.
Die WHEN-Klauseln werden von oben nach unten bewertet.
Die Ausdrücke ausdruck1,... der WHEN-Klauseln werden von links nach rechts berechnet.
Wenn ein derart berechneter Wert eines Ausdrucks mit dem Wert von ausdruckx übereinstimmt, dann wird der zugehörige THEN-Zweig ausgeführt und danach die CASE-Anweisung beendet.
Wenn keiner der berechneten Werte mit ausdruckx uebereinstimmt, aber ein ELSE-Zweig vorhanden ist, dann wird der ELSE-Zweig der CASE-Anweisung ausgeführt und danach die CASE-Anweisung beendet.
Wenn keiner der berechneten Werte mit ausdruckx uebereinstimmt und kein ELSE-Zweig vorhanden ist, dann wird die CASE-Anweisung mit SQLSTATE '20000' beendet.
Beispiel
Einfache CASE-Anweisung zur Berechnung des Feiertagszuschlages beim Lohn.
CASE MOD(JULIAN_DAY_OF_DATE(CURRENT_DATE),7) WHEN 0,1,2,3,4 /* heute ist normaler Werktag */ THEN UPDATE lohntabelle SET lohn = zeit_lohn; WHEN 5 /* heute ist Samstag, 25% Aufschlag */ THEN UPDATE lohntabelle SET lohn = zeit_lohn * 1.25; WHEN 6 /* heute ist Sonntag, 50% Aufschlag */ THEN UPDATE lohntabelle SET lohn = zeit_lohn * 1.50; END CASE
Obige CASE-Anweisung könnte auch als UPDATE-Anweisung mit einem entsprechenden case_ausdruck gestaltet werden.
UPDATE lohntabelle SET lohn = zeit_lohn * CASE MOD(JULIAN_DAY_OF_DATE(CURRENT_DATE),7) WHEN 0,1,2,3,4 /* heute ist normaler Werktag */ THEN 1.00 WHEN 5 /* heute ist Samstag, 25% Aufschlag */ THEN 1.25 WHEN 6 /* heute ist Sonntag, 50% Aufschlag */ THEN 1.50 END
Format der CASE-Anweisung mit Suchbedingung
CASE WHEN
suchbedingung THEN THEN
routine_sql_anweisung; [
routine_sql_anweisung; ] ...
...
[ ELSE
routine_sql_anweisung; [
routine_sql_anweisung; ] ...]
END CASE
suchbedingung
Suchbedingung, deren Auswertung einen Wahrheitswert ergibt.
Wenn das Ergebnis der Suchbedingung „unbestimmt“ ist, dann wird in der THEN-Klausel keine SQL-Anweisung ausgeführt.
routine_sql_anweisung
Siehe „Format der einfachen CASE-Anweisung".
Ausführungshinweise
Die WHEN-Klauseln werden von oben nach unten bewertet.
Die suchbedingung der WHEN-Klausel wird ausgewertet.
Wenn eine derart berechnete Suchbedingung den Wahrheitswert WAHR ergibt, dann wird der zugehörige THEN-Zweig ausgeführt und danach die CASE-Anweisung beendet.
Wenn keine der berechneten Suchbedingungen den Wahrheitswert WAHR ergibt, aber ein ELSE-Zweig vorhanden ist, dann wird der ELSE-Zweig der CASE-Anweisung ausgeführt und danach die CASE-Anweisung beendet.
Wenn keine der berechneten Suchbedingungen den Wahrheitswert WAHR ergibt und kein ELSE-Zweig vorhanden ist, dann wird die CASE-Anweisung mit SQLSTATE '20000' beendet.
Beispiel
CASE-Anweisung mit Suchbedingung.
CASE WHEN (EXISTS(select * from T1 where cola = 17)) THEN update T1 set colb = colb * 1.05; WHEN (EXISTS(select * from T2 where colx = 27)) THEN insert into T2 (pk, coly) values (*, 423); END CASE