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.1
IF(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:

  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.1
    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.1
    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.1
    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.1
    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.1
    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.1
    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.1
IFNULL(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.1
COALESCE(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.1
CASE
    WHEN wert1 IS NOT NULL THEN wert1
    WHEN wert2 IS NOT NULL THEN wert2
    ELSE wert3
END

Mit COALESCE (deutlich einfacher):

MySQL 8.1
COALESCE(wert1, wert2, wert3)

Beispiele zur Funktion IFNULL

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

    MySQL 8.1
    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.1
    SELECT COALESCE('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    coalesce
    SQL Academy
  • Ist das erste Argument gleich NULL, wird der als zweites Argument übergebene Wert zurückgegeben.

    MySQL 8.1
    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.1
    SELECT COALESCE(NULL, 'Alternative zu SQL Academy') AS sql_trainer;
    
    coalesce
    Alternative zu SQL Academy
  • COALESCE kann beliebig viele Argumente entgegennehmen, was den Code sehr lesbar macht:

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

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

    MySQL 8.1
    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.1
    SELECT NULLIF('SQL Academy', 'Alternative zu SQL Academy') AS sql_trainer;
    
    nullif
    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.