IIF in T-SQL

By Frank Kalis

Posted on Jul 13, 2004 von in SQL Server

Dies ist eine oft gestellte Frage in SQL Server Communities. Die Antwort lautet...

Wie bereits im Eingangstext angedeutet, ist dies eine sehr beliebte Frage. Gestellt wird sie meistens von Leuten, die mit einem Hintergrund in Microsoft Access auf den SQL Server umsteigen oder den SQL Server als Backend für ein Access Front-End nutzen wollen.

Leider ist die übliche Antwort darauf nicht ganz so beliebt:

Es gibt kein IIf in T-SQL.

Die entprechenden Statements werden wohl oder übel unter Verwendung von CASE umgeschrieben werden müssen. Betrachten wir dies einmal an einem Beispiel.

SELECT 
Customers.CustomerID
, Customers.CompanyName
, Customers.Country
, IIf([Country]="Germany","0049 " & [Phone],[Phone]) AS Telefon
FROM
Customers;

Dies ist eine gültige Abfrage in Access, die innerhalb der Northwind Beispieldatenbank auswertet, ob ein Kunde in Deutschland ansässig ist. Wenn dies der Fall ist, wird der Telefonnummer automatisch ist Ländervorwahl 0049 vorangestellt. Läßt man die Abfrage unverändert im Query Analyzer laufen, passiert folgendes:

Server: Msg 170, Level 15, State 1, Line 5
Line 5: Incorrect syntax near '='.

Das war's. Die Abfrage bricht mit dieser Fehlermeldung ab. Wie weiter oben erwähnt, muß die Abfrage umformuliert werden. Diese sähe dann unter Verwendung von CASE in etwa so aus:

SELECT 
Customers.CustomerID
, Customers.CompanyName
, Customers.Country
, CASE
WHEN Country='Germany'
THEN '0049 ' + Phone
ELSE Phone
END AS Phone
FROM
Customers;

Diese Abfrage kann der SQL Server verstehen und liefert das erwartete Resultset zurück.

CASE ist eines der mächtigsten Sprachkonstrukte in SQL. Im Gegensatz zu IIf, wo man nur eine logische Überprüfung eines Ausdruckes auf einmal vornehmen kann, gilt diese Limitation nicht für CASE. Versuchen Sie zum Beispiel einmal, dies in einen einzigen IIf Ausdruck zu bringen:

SELECT 
Customers.CustomerID
, Customers.CompanyName
, Customers.Country
, CASE Country
WHEN 'Germany'
THEN '0049 ' + Phone
WHEN 'Mexico'
THEN 'Fiesta ' + Phone
WHEN 'UK'
THEN 'Black Pudding (Yuk!) ' + Phone
ELSE Phone
END AS Phone
FROM
Customers;

Mit CASE ist das kein Problem und auch wenn das Beispiel nicht übermässig Sinn macht, so wird doch hier erkennbar welche Möglichkeiten man mit CASE in der Hand hat. Hat man sich erst einmal an den Gebrauch von CASE gewöhnt, wird man wahrscheinlich IIf kaum vermissen.

Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , ,

2 Kommentare

Benutzerwertungen
5 Stern:
 
(0)
4 Stern:
 
(0)
3 Stern:
 
(1)
2 Stern:
 
(0)
1 Stern:
 
(0)
1 Bewertung
Durschn. Benutzerwertung:
(3.0)

Kommentar von: Wolf

Wolf
Es gibt ab SQL-Server 2012 den IIF in Transact SQL: http://msdn.microsoft.com/de-de/library/hh213574.aspx Und die funktioniert sehr gut. :-)
30.04.13 @ 10:56
Korrekt und Danke für den Link! Dieser Beitrag ist mittlerweile fast 10 Jahre alt. Ich sollte vielleicht in einem separaten Beitrag darauf aufmerksam machen. :-)
30.04.13 @ 11:38


Formular wird geladen...