Kurs
Wenn du mit realen Daten arbeitest, sind fehlende Werte fast unvermeidlich. Egal ob du Datensätze bereinigst oder Spalten zusammenführst, SQL bietet eine einfache, aber leistungsstarke Lösung: die Funktion COALESCE(). In diesem Tutorial erfährst du, wie COALESCE() funktioniert, wann du es einsetzen kannst und wie du es anhand von praktischen Beispielen anwendest - und das alles in nur wenigen Zeilen SQL.
Was ist COALESCE() in SQL?
Die Funktion COALESCE() in SQL gibt den ersten Nicht-Null-Wert aus einer Liste von Ausdrücken zurück. Wenn alle Werte null sind, wird null zurückgegeben. Sie wird häufig verwendet, um mit fehlenden Werten umzugehen oder mehrere Spalten in einer Fallback-Ausgabe zu kombinieren.
Wann solltest du COALESCE() verwenden?
Diese Funktion ist nützlich, wenn du die Werte aus mehreren Spalten zu einer einzigen zusammenfassen willst.
Die Tabelle "Benutzer" enthält zum Beispiel die Werte der Benutzer work_email und personal_email.
Mit der Funktion COALESCE() können wir eine Spalte namens E-Mail erstellen, die die E-Mail-Adresse des Nutzers work_email anzeigt, wenn sie nicht null ist. Andernfalls zeigt sie personal_email an.
|
|
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
|
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
|
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Syntax von COALESCE()
COALESCE(value_1, value_2, ...., value_n)
Die Funktion COALESCE() nimmt mindestens einen Wert auf (value_1). Sie gibt den ersten Nicht-Null-Wert in der Liste zurück, von links nach rechts.
Zum Beispiel wird zuerst geprüft, ob value_1 null ist. Wenn nicht, dann gibt es value_1 zurück. Andernfalls wird geprüft, ob value_2 null ist. So geht es weiter, bis die Liste vollständig ist.
COALESCE() kann mit Spalten, Ausdrücken oder Konstanten verwendet werden.
Praktische Beispiele für COALESCE()
Führe den Code aus diesem Tutorial online aus und bearbeite ihn
Code ausführenBeispiel 1: Ersetzen der Null durch eine Konstante
Betrachte die Tabelle countries mit einer Liste von Ländern und ihren Nationalfeiertagen. Einige nationale Tageswerte sind null. COALESCE() füllt fehlende Werte in national_day mit der konstanten Zeichenfolge 'Unknown' auf.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
Die Ergebnisse sind wie folgt:
|
|
|
|
|
|
1 |
Aruba |
null |
Unbekannt |
|
2 |
Afghanistan |
1919-08-19T00:00:00.000Z |
1919-08-19 |
|
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
|
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Beachte, dass der Wert null in national_day durch eine Konstante Unknown ersetzt wird.
Beispiel 2: Zwischen zwei Spalten wählen
Wir haben eine Tabelle mit dem Namen products. Sie enthält den Produktnamen und seine Beschreibung. Einige Beschreibungen sind zu lang (mehr als 60 Zeichen). In diesem Fall ersetzen wir die Beschreibung durch den Produktnamen.
Die folgende Abfrage verwendet CASE, um lange Beschreibungen in NULL umzuwandeln, und verwendet dann COALESCE(), um auf den Produktnamen zurückzugreifen.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
Die Ergebnisse sind wie folgt:
product_name |
|
|
|
G.Skill Ripjaws V Serie |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Serie |
|
G.Skill Ripjaws V Serie |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws V Serie |
|
Asus X99-E-10G WS |
"CPU:LGA2011-3,Formfaktor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
"CPU:LGA2011-3,Formfaktor:SSI CEB,RAM Slots:8,Max RAM:128GB" |
|
Supermicro X9SRH-7TF |
"CPU:LGA2011,Formfaktor:ATX,RAM Slots:8,Max RAM:64GB" |
"CPU:LGA2011,Formfaktor:ATX,RAM Slots:8,Max RAM:64GB" |
Beachte, wie die Spalte product_name_or_description die product_name anzeigt, wenn die description lang ist. Andernfalls wird die Seite description angezeigt.
Beispiel 3: Fallback-Logik mit mehreren Spalten
Wir können Beispiel 2 noch einen Schritt weiter gehen. Nehmen wir an, dass es derzeit zwei Anforderungen gibt:
- Wenn die Länge der
descriptionweniger als 60 beträgt, dann zeige diedescriptionan. - Andernfalls prüfe, ob die Länge der
product_nameweniger als 20 beträgt. Wenn ja, zeigen wir dieproduct_namean. - Andernfalls wird
productangezeigt.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
Die Ergebnisse sind wie folgt:
|
|
|
|
|
ADATA ASU800SS-128GT-C |
Serie:Ultimate SU800,Typ:SSD,Kapazität:128GB,Cache:N/A |
Produkt |
|
ADATA ASU800SS-512GT-C |
Serie:Ultimate SU800,Typ:SSD,Kapazität:512GB,Cache:N/A |
Produkt |
|
AMD 100-5056062 |
Chipsatz:Vega Frontier Edition Liquid,Speicher:16GBKerntakt:1,5GHz |
Produkt |
|
AMD 100-505989 |
Chipsatz:FirePro W9100,Speicher:32GBKerntakt:930MHz |
Chipsatz:FirePro W9100,Speicher:32GBKerntakt:930MHz |
Beachte, dass in der Spalte product_name_or_description entweder product_name oder description angezeigt wird, je nachdem wie lang product_name oder description ist.
Unterstützte SQL-Engines
COALESCE() funktioniert in SQL Server (ab 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery und Amazon RedShift.
Verwandte SQL-Funktionen
Schlussgedanken
Die Funktion COALESCE() ist ein vielseitiges Werkzeug, um Nullwerte zu behandeln und deine SQL-Abfragen zu vereinfachen. Egal, ob du fehlende Daten durch Standardwerte ersetzt oder mehrere Spalten zu einer zusammenfasst, COALESCE() hilft dir, deine Logik sauber und lesbar zu halten.
Bist du bereit, deine SQL-Kenntnisse zu vertiefen? Schau dir diese anfängerfreundlichen und karrierefördernden Kurse auf DataCamp an:
FAQs
Was passiert, wenn alle Werte in COALESCE() NULL sind?
Wenn jedes an die Funktion COALESCE() übergebene Argument NULL ist, gibt die Funktion NULL zurück.
Wie unterscheidet sich COALESCE() von ISNULL() oder IFNULL()?
ISNULL()(SQL Server) undIFNULL()(MySQL, SQLite) akzeptieren nur zwei Argumente.-
COALESCE()kann mehrere Argumente akzeptieren und ist ein Standard in allen SQL-Dialekten. -
COALESCE()ist Teil des ANSI SQL-Standards, währendISNULL()undIFNULL()datenbankspezifisch sind.
Kann ich COALESCE() mit Ausdrücken oder Funktionen verwenden?
Ja, du kannst Spaltennamen, Literale, Funktionen oder Ausdrücke innerhalb von COALESCE() verwenden.
COALESCE(LOWER(name), 'unknown')Ist die Verwendung von COALESCE() mit Leistungseinbußen verbunden?
Im Allgemeinen ist no-COALESCE() effizient. Wenn du sie jedoch mit komplexen Ausdrücken oder in großen Abfragen verwendest, kann es sein, dass die Datenbank mehr Ausdrücke auswertet als nötig, je nachdem, wie sie geschrieben ist.
Funktioniert COALESCE() mit verschiedenen Datentypen?
Ja, aber alle Argumente sollten implizit in einen gemeinsamen Datentyp konvertierbar sein. Andernfalls kann es je nach SQL-Engine zu einem Typkonvertierungsfehler kommen.
Kann ich COALESCE()-Funktionen verschachteln?
Ja. Du kannst sie verschachteln, aber das ist selten nötig, da COALESCE() bereits mehrere Argumente verarbeitet:
COALESCE(col1, COALESCE(col2, 'default'))
Dies ist gleichbedeutend mit:
COALESCE(col1, col2, 'default')
