Die bedingte Funktion IF
Im vorherigen Kapitel haben wir den Operator CASE für bedingte Logik in SQL betrachtet. Das ist allerdings nicht der einzige Mechanismus, mit dem du Verzweigungen in einer Query abbilden kannst. Jetzt ist die Funktion IF an der Reihe.
Syntax von IF
MySQL 8.1IF(bedingung, wert_1, wert_2);
Wenn die als erstes Argument übergebene Bedingung wahr ist, gibt die Funktion IF den Wert des zweiten Arguments wert_1 zurück, andernfalls den Wert des dritten Arguments wert_2.
Zusätzliche Funktionen für bedingte Logik
Im vorherigen Kapitel haben wir den Operator CASE für bedingte Logik in SQL kennengelernt. PostgreSQL stellt zusätzliche Funktionen bereit, die die Arbeit mit bedingter Logik in Spezialfällen vereinfachen. Diese Funktionen sind besonders nützlich im Umgang mit NULL-Werten und machen den Code lesbarer.
Funktionen für bedingte Logik
Neben dem universellen CASE-Operator bietet PostgreSQL:
- Funktion COALESCE – für die Arbeit mit NULL-Werten
- Funktion NULLIF – für Spezialfälle rund um NULL
Diese Funktionen gehören zum SQL-Standard und machen den Code in bestimmten Situationen deutlich lesbarer.
Beispiele
-
Ein einfacher Vergleich zweier Zahlen. Weil 10 nicht größer als 20 ist, gibt die Funktion 'FALSE' zurück.
MySQL 8.1SELECT IF(10 > 20, 'TRUE', 'FALSE');
-
Ein einfaches Beispiel für bedingte Logik mit dem CASE-Operator aus dem vorherigen Kapitel:
MySQL 8.1SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
-
Ein Beispiel mit einer echten Datenbank. Anhand des Preises soll bestimmt werden, ob eine Unterkunft zur "Komfort-Klasse" oder zur "Economy-Klasse" gehört. Liegt der Preis bei 150 oder darüber, zählt die Unterkunft zur "Komfort-Klasse".
MySQL 8.1SELECT id, price, IF(price >= 150, 'Komfort-Klasse', 'Economy-Klasse') AS category FROM Rooms
-
Ein Beispiel mit echten Daten. Der CASE-Operator hilft dabei, Unterkünfte nach Preis zu kategorisieren:
MySQL 8.1SELECT id, price, CASE WHEN price >= 150 THEN 'Komfort-Klasse' ELSE 'Economy-Klasse' END AS category FROM Rooms
-
IF-Funktionen lassen sich auch ineinander verschachteln und so der CASE-Operator nachbilden.
MySQL 8.1SELECT id, price, IF(price >= 200, 'Business-Klasse', IF(price >= 150, 'Komfort-Klasse', 'Economy-Klasse')) AS category FROM Rooms
-
CASE eignet sich hervorragend für mehrere Bedingungen:
MySQL 8.1SELECT id, price, CASE WHEN price >= 200 THEN 'Business-Klasse' WHEN price >= 150 THEN 'Komfort-Klasse' ELSE 'Economy-Klasse' END AS category FROM Rooms
Für Spezialfälle bietet PostgreSQL allerdings noch zugeschnittenere Funktionen.
Die Funktionen IFNULL und NULLIF
Neben IF gibt es in MySQL auch die einfacheren, aber weniger universellen Funktionen IFNULL und NULLIF, die speziell für die Behandlung von NULL-Werten gedacht sind.
Syntax von IFNULL
MySQL 8.1IFNULL(wert, alternativ_wert);
Die Funktion IFNULL gibt den als erstes Argument übergebenen wert zurück, sofern dieser nicht NULL ist; ansonsten wird alternativ_wert zurückgegeben.
Die Funktion COALESCE
COALESCE ist eine elegante Lösung für den Umgang mit NULL-Werten. Sie liefert den ersten Wert aus der Argumentliste, der nicht NULL ist.
Syntax
MySQL 8.1COALESCE(wert1, wert2, ..., wertN);
Das ist deutlich angenehmer, als lange CASE-Ausdrücke für die NULL-Behandlung zu schreiben.
Vergleich der Ansätze
Mit CASE:
MySQL 8.1CASE WHEN wert1 IS NOT NULL THEN wert1 WHEN wert2 IS NOT NULL THEN wert2 ELSE wert3 END
Mit COALESCE (deutlich einfacher):
MySQL 8.1COALESCE(wert1, wert2, wert3)
Beispiele zur Funktion IFNULL
-
Ist das erste Argument ungleich NULL, wird genau dieser Wert zurückgegeben.
MySQL 8.1SELECT IFNULL('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
Beispiele zur Funktion COALESCE
-
Ist das erste Argument ungleich NULL, wird genau dieser Wert zurückgegeben.
MySQL 8.1SELECT COALESCE('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
-
Ist das erste Argument gleich NULL, wird der als zweites Argument übergebene Wert zurückgegeben.
MySQL 8.1SELECT IFNULL(NULL, 'Alternative zu SQL Academy') AS sql_trainer;
-
Ist das erste Argument gleich NULL, wird der nächste Wert geliefert, der nicht NULL ist.
MySQL 8.1SELECT COALESCE(NULL, 'Alternative zu SQL Academy') AS sql_trainer; -
COALESCE kann beliebig viele Argumente entgegennehmen, was den Code sehr lesbar macht:
MySQL 8.1SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Notfallvariante') AS sql_trainer;
Die Funktion NULLIF
NULLIF ist praktisch, wenn du einen bestimmten Wert durch NULL ersetzen willst. Das hilft beim Filtern oder beim Umgang mit "leeren" Werten.
Syntax von NULLIF
MySQL 8.1NULLIF(wert_1, wert_2);
Die Funktion NULLIF liefert NULL, wenn wert_1 gleich wert_2 ist; andernfalls gibt sie wert_1 zurück.
Beispiele zur Funktion NULLIF
-
Sind beide Argumente gleich, wird NULL zurückgegeben.
MySQL 8.1SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Sind beide Argumente gleich, wird NULL zurückgegeben.
MySQL 8.1SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Unterscheiden sich die beiden Argumente, wird der Wert des ersten Arguments zurückgegeben.
MySQL 8.1SELECT NULLIF('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
-
Unterscheiden sich die beiden Argumente, wird der Wert des ersten Arguments zurückgegeben.
MySQL 8.1SELECT NULLIF('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
Wann welche Funktion sinnvoll ist:
- CASE: wenn du komplexe bedingte Logik mit mehreren Verzweigungen brauchst
- COALESCE: wenn du NULL-Werte durch Standardwerte ersetzen willst
- NULLIF: wenn du bestimmte Werte in NULL umwandeln möchtest
Diese Funktionen machen den Code lesbarer und sind Teil des SQL-Standards.