Fallunterscheidungen mit CASE Anweisungen
Eine Schwäche von SQL ist, dass es sich eine nicht prozedurale Sprache handelt. Eine Erweiterung, die hier einen Ausgleich zu Sprachen wie z.B. VB bringt ist die Anweisung CASE.
CASE wertet einen Ausdruck aus und gibt einen von mehreren denkbaren Ausdrücken zurück. CASE gibt es in zwei Versionen:
Einfache Version: Vergleich eines Ausdrucks mit verschiedenen einfachen Ausdrücken
Komplexe Version: Liste von Bedingungen, die True oder False zurückgeben
Case kann überall dort verwendet werden, wo ein Ausdruck erlaubt ist. Dies kann innerhalb von Spaltenlisten im Select-Abschnitt, aber auch innerhalb von Where- und Order-By-Abschnitten sein. Damit ist z.B. eine vom Benutzer festgelegte und durch einen Parameterwert erzeugte Sortierung möglich.
Syntax
Einfache Version
CASE <Prüfausdruck>
WHEN <erste Möglichkeit> THEN <erstes Resultat>
WHEN <zweite Möglichkeit> THEN <zweites Resultat>
ELSE <alternatives Resultat>
END
Beispiel:
Select
Firma,
case Status
WHEN 10 THEN ‘SUPER’
WHEN 20 THEN ‘OK’
ELSE ‘SCHLECHT’
end as Bewertung
FROM KDE
Komplexe Version
CASE
WHEN <erster Boolean-Ausdruck> THEN <erstes Resultat>
ELSE <alternatives Resultat>
END
Beispiel
SELECT
POS.PNR,
BEZ,
SUM(MENGE*VKP) as UMSATZ,
Case
WHEN SUM(MENGE*VKP) > (SELECT SUM(MENGE*VKP) FROM POS WHERE PNR = 20) THEN ‘Besser’
WHEN SUM(MENGE*VKP) < (SELECT SUM(MENGE*VKP) FROM POS WHERE PNR = 20) THEN ‘Schlechter’
end as Bewertung
FROM
PROD join POS on POS.PNR = PROD.PNR
Group By
POS.PNR, BEZ
Argumente
<Prüfausdruck>
der auszuwertende Ausdruck für die einfache Case-Version
<erste Möglichkeit>
der erste Ausdruck, der auf die Übereinstimmung mit dem Prüfausdruck getestet wird
<erstes Resultat>
das erste auszugebende Ergebnis
<alternatives Resultat>
das Ergebnis, welches ausgegeben wird, falls alle Prüfungen zuvor nicht positiv waren
<erster Boolean-Ausdruck>
ein Boolean-Ausdruck, der Vergleichsoperatoren (=, !=), Klauseln (Is Null, Between) und ähnliches enthalten kann oder eine Kombination mehrerer Boolean-Ausdrücke mit And/Or
Hinweise
Die einfache Version überprüft nur auf Gleichheit zwischen dem Prüfausdruck und den verschiedenen Alternativen mit dem ‘=’ – Operator. Damit kann sie durch die komplexe Version dargestellt werden, so das sie theoretisch entfernt werden könnte:
CASE
WHEN <Prüfausdruck> = <erste Möglichkeit>
THEN <erstes Resultat>
[...]
[
ELSE <alternatives Resultat>
]
END