SQL Academy
Premium

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.4
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:

  1. Funktion COALESCE – für die Arbeit mit NULL-Werten
  2. 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.4
    SELECT IF(10 > 20, 'TRUE', 'FALSE');
    
    IF(10 > 20, "TRUE", "FALSE")
    FALSE
  • Ein einfaches Beispiel für bedingte Logik mit dem CASE-Operator aus dem vorherigen Kapitel:

    MySQL 8.4
    SELECT CASE WHEN 10 > 20 THEN 'TRUE' ELSE 'FALSE' END;
    
    case
    FALSE
  • 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.4
    SELECT id, price,
        IF(price >= 150, 'Komfort-Klasse', 'Economy-Klasse') AS category
        FROM Rooms
    
    idpricecategory
    1149Economy-Klasse
    2225Komfort-Klasse
    3150Komfort-Klasse
    489Economy-Klasse
    580Economy-Klasse
    6200Komfort-Klasse
    760Economy-Klasse
    879Economy-Klasse
    979Economy-Klasse
    10150Komfort-Klasse
    11135Economy-Klasse
    1285Economy-Klasse
    1389Economy-Klasse
    1485Economy-Klasse
    15120Economy-Klasse
    16140Economy-Klasse
    17215Komfort-Klasse
    18140Economy-Klasse
    1999Economy-Klasse
    20190Komfort-Klasse
    21299Komfort-Klasse
    22130Economy-Klasse
    2380Economy-Klasse
    24110Economy-Klasse
    25120Economy-Klasse
    2660Economy-Klasse
    2780Economy-Klasse
    28150Komfort-Klasse
    2944Economy-Klasse
    30180Komfort-Klasse
    3150Economy-Klasse
    3252Economy-Klasse
    3355Economy-Klasse
    3450Economy-Klasse
    3570Economy-Klasse
    3689Economy-Klasse
    3735Economy-Klasse
    3885Economy-Klasse
    39150Komfort-Klasse
    4040Economy-Klasse
    4168Economy-Klasse
    42120Economy-Klasse
    43120Economy-Klasse
    44135Economy-Klasse
    45150Komfort-Klasse
    46150Komfort-Klasse
    47130Economy-Klasse
    48110Economy-Klasse
    49115Economy-Klasse
    5080Economy-Klasse
  • Ein Beispiel mit echten Daten. Der CASE-Operator hilft dabei, Unterkünfte nach Preis zu kategorisieren:

    MySQL 8.4
    SELECT id, price,
        CASE WHEN price >= 150 THEN 'Komfort-Klasse' ELSE 'Economy-Klasse' END AS category
        FROM Rooms
    
    idpricecategory
    1149Economy-Klasse
    2225Komfort-Klasse
    3150Komfort-Klasse
    489Economy-Klasse
    580Economy-Klasse
    6200Komfort-Klasse
    760Economy-Klasse
    879Economy-Klasse
    979Economy-Klasse
    10150Komfort-Klasse
    11135Economy-Klasse
    1285Economy-Klasse
    1389Economy-Klasse
    1485Economy-Klasse
    15120Economy-Klasse
    16140Economy-Klasse
    17215Komfort-Klasse
    18140Economy-Klasse
    1999Economy-Klasse
    20190Komfort-Klasse
    21299Komfort-Klasse
    22130Economy-Klasse
    2380Economy-Klasse
    24110Economy-Klasse
    25120Economy-Klasse
    2660Economy-Klasse
    2780Economy-Klasse
    28150Komfort-Klasse
    2944Economy-Klasse
    30180Komfort-Klasse
    3150Economy-Klasse
    3252Economy-Klasse
    3355Economy-Klasse
    3450Economy-Klasse
    3570Economy-Klasse
    3689Economy-Klasse
    3735Economy-Klasse
    3885Economy-Klasse
    39150Komfort-Klasse
    4040Economy-Klasse
    4168Economy-Klasse
    42120Economy-Klasse
    43120Economy-Klasse
    44135Economy-Klasse
    45150Komfort-Klasse
    46150Komfort-Klasse
    47130Economy-Klasse
    48110Economy-Klasse
    49115Economy-Klasse
    5080Economy-Klasse
  • IF-Funktionen lassen sich auch ineinander verschachteln und so der CASE-Operator nachbilden.

    MySQL 8.4
    SELECT id, price,
        IF(price >= 200, 'Business-Klasse',
            IF(price >= 150,
                'Komfort-Klasse', 'Economy-Klasse')) AS category
        FROM Rooms
    
    idpricecategory
    1149Economy-Klasse
    2225Business-Klasse
    3150Komfort-Klasse
    489Economy-Klasse
    580Economy-Klasse
    6200Business-Klasse
    760Economy-Klasse
    879Economy-Klasse
    979Economy-Klasse
    10150Komfort-Klasse
    11135Economy-Klasse
    1285Economy-Klasse
    1389Economy-Klasse
    1485Economy-Klasse
    15120Economy-Klasse
    16140Economy-Klasse
    17215Business-Klasse
    18140Economy-Klasse
    1999Economy-Klasse
    20190Komfort-Klasse
    21299Business-Klasse
    22130Economy-Klasse
    2380Economy-Klasse
    24110Economy-Klasse
    25120Economy-Klasse
    2660Economy-Klasse
    2780Economy-Klasse
    28150Komfort-Klasse
    2944Economy-Klasse
    30180Komfort-Klasse
    3150Economy-Klasse
    3252Economy-Klasse
    3355Economy-Klasse
    3450Economy-Klasse
    3570Economy-Klasse
    3689Economy-Klasse
    3735Economy-Klasse
    3885Economy-Klasse
    39150Komfort-Klasse
    4040Economy-Klasse
    4168Economy-Klasse
    42120Economy-Klasse
    43120Economy-Klasse
    44135Economy-Klasse
    45150Komfort-Klasse
    46150Komfort-Klasse
    47130Economy-Klasse
    48110Economy-Klasse
    49115Economy-Klasse
    5080Economy-Klasse
  • CASE eignet sich hervorragend für mehrere Bedingungen:

    MySQL 8.4
    SELECT id, price,
        CASE
            WHEN price >= 200 THEN 'Business-Klasse'
            WHEN price >= 150 THEN 'Komfort-Klasse'
            ELSE 'Economy-Klasse'
        END AS category
        FROM Rooms
    
    idpricecategory
    1149Economy-Klasse
    2225Business-Klasse
    3150Komfort-Klasse
    489Economy-Klasse
    580Economy-Klasse
    6200Business-Klasse
    760Economy-Klasse
    879Economy-Klasse
    979Economy-Klasse
    10150Komfort-Klasse
    11135Economy-Klasse
    1285Economy-Klasse
    1389Economy-Klasse
    1485Economy-Klasse
    15120Economy-Klasse
    16140Economy-Klasse
    17215Business-Klasse
    18140Economy-Klasse
    1999Economy-Klasse
    20190Komfort-Klasse
    21299Business-Klasse
    22130Economy-Klasse
    2380Economy-Klasse
    24110Economy-Klasse
    25120Economy-Klasse
    2660Economy-Klasse
    2780Economy-Klasse
    28150Komfort-Klasse
    2944Economy-Klasse
    30180Komfort-Klasse
    3150Economy-Klasse
    3252Economy-Klasse
    3355Economy-Klasse
    3450Economy-Klasse
    3570Economy-Klasse
    3689Economy-Klasse
    3735Economy-Klasse
    3885Economy-Klasse
    39150Komfort-Klasse
    4040Economy-Klasse
    4168Economy-Klasse
    42120Economy-Klasse
    43120Economy-Klasse
    44135Economy-Klasse
    45150Komfort-Klasse
    46150Komfort-Klasse
    47130Economy-Klasse
    48110Economy-Klasse
    49115Economy-Klasse
    5080Economy-Klasse

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.4
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

MySQL 8.4
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.4
CASE
    WHEN wert1 IS NOT NULL THEN wert1
    WHEN wert2 IS NOT NULL THEN wert2
    ELSE wert3
END

Mit COALESCE (deutlich einfacher):

MySQL 8.4
COALESCE(wert1, wert2, wert3)

Beispiele zur Funktion IFNULL

  • Ist das erste Argument ungleich NULL, wird genau dieser Wert zurückgegeben.

    MySQL 8.4
    SELECT IFNULL('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy

Beispiele zur Funktion COALESCE

  • Ist das erste Argument ungleich NULL, wird genau dieser Wert zurückgegeben.

    MySQL 8.4
    SELECT COALESCE('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy
  • Ist das erste Argument gleich NULL, wird der als zweites Argument übergebene Wert zurückgegeben.

    MySQL 8.4
    SELECT IFNULL(NULL, 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    Alternative zu SQL Academy
  • Ist das erste Argument gleich NULL, wird der nächste Wert geliefert, der nicht NULL ist.

    MySQL 8.4
    SELECT COALESCE(NULL, 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    Alternative zu SQL Academy
  • COALESCE kann beliebig viele Argumente entgegennehmen, was den Code sehr lesbar macht:

    MySQL 8.4
    SELECT COALESCE(NULL, NULL, 'SQL Academy', 'Notfallvariante') AS sql_trainer;
    
    sql_trainer
    SQL Academy

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.4
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.4
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    sql_trainer
    <NULL>
  • Sind beide Argumente gleich, wird NULL zurückgegeben.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'SQL Academy') AS sql_trainer;
    
    sql_trainer
    <NULL>
  • Unterscheiden sich die beiden Argumente, wird der Wert des ersten Arguments zurückgegeben.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy
  • Unterscheiden sich die beiden Argumente, wird der Wert des ersten Arguments zurückgegeben.

    MySQL 8.4
    SELECT NULLIF('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    sql_trainer
    SQL Academy

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.