Case
wertet eine Liste von Bedingungen 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 bsp.
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>
]
ENDKomplexe Version
CASE
WHEN <erster Boolean-Ausdruck> THEN <erstes Resultat>
[...]
[
ELSE <alternatives Resultat>
]
ENDArgumente
- <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
Beispiele
Beispiel für eine ad-hoc-Übersetzung innerhalb der auszugebenden Spalten:
Select A.A_Name, CASE A.A_Name
When 'Hose' Then 'pantaloon'
When 'Oberhemd' Then 'shirt'
When 'Mantel' Then 'coat'
End
As [english]
From Artikel As A
Beispiel für eine benutzerdefinierte Festlegung der Sortierung: Sei @Column_Name eine nvarchar(50)-Spalte,
welche mit dem Wert einer Spalte der Tabelle 'Artikel' belegt sei. Dann ist der folgende Code ungültig:
Select A.*
From Artikel As A
Order By @Column_Name
In Sortierausdrücken sind keine Variablen anstelle von Spaltennamen erlaubt. Der folgende Code ist jedoch gültig:
Select *
From Artikel As A
Order By
Case @Column_Name
When 'ArtikelId' Then Cast(A.ArtikelId as sql_variant)
When 'A_Name' Then A.A_Name
When 'A_Preis' Then A.A_Preis
End
Der einzigste Nachteil besteht darin, daß sich der Datentyp der Sortierspalte nach der ersten Spalte richtet, welcher
von der Case-Anweisung zurückgegeben wird. Zur Vermeidung von Konvertierungsproblemen muß deshalb die erste Rückgabe
in den sql_variant-Datentyp transferiert werden.
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 daß sie theoretisch
entfernt werden könnte:
CASE
WHEN <Prüfausdruck> = <erste Möglichkeit>
THEN <erstes Resultat>
[...]
[
ELSE <alternatives Resultat>
]
END © 2003-2009 Jürgen Auer, Berlin.