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
IF(bedingung, wert_wenn_wahr, wert_wenn_falsch)- bedingung
- Der logische Ausdruck, der geprüft wird, zum Beispiel price > 100.
- wert_wenn_wahr
Der Wert, den IF zurückgibt, wenn die Bedingung wahr ist.
- wert_wenn_falsch
Der Wert, den IF zurückgibt, wenn die Bedingung falsch oder NULL ist.
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.4SELECT IF(10 > 20, 'TRUE', 'FALSE');
-
Ein einfaches Beispiel für bedingte Logik mit dem CASE-Operator aus dem vorherigen Kapitel:
MySQL 8.4SELECT 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.4SELECT 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.4SELECT 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.4SELECT 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.4SELECT 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
IFNULL(wert, alternativ_wert)- wert
Der Wert, der geprüft wird, zum Beispiel eine Spalte, in der NULL vorkommen kann. Ist er nicht NULL, gibt die Funktion ihn zurück.
- alternativ_wert
Der Wert, den die Funktion zurückgibt, wenn wert NULL ist.
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
COALESCE(wert [, ...])- [ ]optionaler Teil
- ...kann wiederholt werden
- wert
Werte durch Kommas getrennt, zum Beispiel Tabellenspalten. Sie werden von links nach rechts geprüft, und als letzten Wert kannst du einen Ersatzwert angeben.
Das ist deutlich angenehmer, als lange CASE-Ausdrücke für die NULL-Behandlung zu schreiben.
Vergleich der Ansätze
Mit CASE:
MySQL 8.4CASE WHEN wert1 IS NOT NULL THEN wert1 WHEN wert2 IS NOT NULL THEN wert2 ELSE wert3 END
Mit COALESCE (deutlich einfacher):
MySQL 8.4COALESCE(wert1, wert2, wert3)
Beispiele zur Funktion IFNULL
-
Ist das erste Argument ungleich NULL, wird genau dieser Wert zurückgegeben.
MySQL 8.4SELECT 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.4SELECT 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.4SELECT 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.4SELECT COALESCE(NULL, 'Alternative zu SQL Academy') AS sql_trainer; -
COALESCE kann beliebig viele Argumente entgegennehmen, was den Code sehr lesbar macht:
MySQL 8.4SELECT 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
NULLIF(wert_1, wert_2)- wert_1
Der Wert, den die Funktion zurückgibt, wenn er nicht gleich wert_2 ist.
- wert_2
Der Vergleichswert. Ist wert_1 gleich diesem Wert, gibt die Funktion NULL zurück.
Beispiele zur Funktion NULLIF
-
Sind beide Argumente gleich, wird NULL zurückgegeben.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Sind beide Argumente gleich, wird NULL zurückgegeben.
MySQL 8.4SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
-
Unterscheiden sich die beiden Argumente, wird der Wert des ersten Arguments zurückgegeben.
MySQL 8.4SELECT 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.4SELECT 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.