Heute tauchen wir wieder tiefer in das Thema NULL-Handling ein und lernen eine echt nützliche Funktion kennen – COALESCE(). Mit dieser Funktion kannst du ganz elegant mit NULL-Werten in deinen Daten umgehen.
Schau dir mal folgendes Beispiel an: Du hast eine Tabelle mit Infos über Mitarbeitende, aber bei manchen fehlt das Gehalt. Was passiert, wenn wir versuchen, alle Gehälter zu erhöhen? Nichts Gutes. Mit NULL kann man nämlich keine Berechnungen machen. Und was, wenn wir NULL-Gehälter einfach durch 0 ersetzen wollen? Hier kommt COALESCE() ins Spiel.
COALESCE() ist eine Funktion, die den ersten Wert, der nicht NULL ist, aus der übergebenen Argumentliste zurückgibt. Wenn alle Werte in der Liste NULL sind, gibt die Funktion NULL zurück. Einfach gesagt: Sie sagt quasi: "Gib mir bitte den ersten brauchbaren Wert, den du finden kannst!"
Syntax
COALESCE(value1, value2, ..., value_n)
value1, value2, ..., value_n sind die Argumente, die du der Funktion übergibst. Sie gibt den ersten Wert zurück, der nicht NULL ist.
Beispiele für COALESCE() in Aktion
Hier ein paar Beispiele.
Beispiel 1: NULL durch 0 ersetzen
Angenommen, wir haben eine Tabelle salaries:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
Wir wollen die Gesamtsumme der Gehälter berechnen – das ist easy:
SELECT SUM(salary) AS total_salary
FROM salaries;
Die Funktion SUM() ignoriert NULL, also kein Problem.
Aber dann wollen wir die Gesamtsumme berechnen, wenn wir jedem Mitarbeitenden einen Bonus von 1000 geben.
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
Und jetzt wird das Ergebnis komisch. Am besten ist es, die NULL-Werte direkt mit COALESCE auf 0 zu setzen. So geht’s:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
Ergebnis:
| total_salary |
|---|
| 110000 |
So ist das viel besser und sicherer.
Beispiel 2: NULL durch einen Standardwert ersetzen
Sagen wir, wir haben eine Tabelle students mit Namen und Adressen:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
Wir wollen NULL in den Adressen durch "Nicht angegeben" ersetzen:
SELECT name, COALESCE(address, 'Nicht angegeben') AS resolved_address
FROM students;
Ergebnis der Abfrage:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | Nicht angegeben |
| Lisa | Painful |
| Alex | Nicht angegeben |
Beispiel 3: Mehrere Werte verwenden
Manchmal willst du NULL nicht nur durch einen Wert ersetzen, sondern eine ganze Reihe von Alternativen durchprobieren. Zum Beispiel: Wir wollen den Namen, den Spitznamen oder "Ohne Namen" nehmen, falls beides fehlt. Tabelle users:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
Abfrage:
SELECT user_id,
COALESCE(first_name, short_name, 'Ohne Namen') AS display_name
FROM users;
Ergebnis:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | Ohne Namen |
Praktische Anwendung von COALESCE()
In der Praxis ist COALESCE() echt ein Rettungsanker, wenn du mit nicht perfekten Daten arbeitest.
Schauen wir mal, wie sie bei verschiedenen Aufgaben hilft.
Beispiel 1: Werte in Textfeldern ersetzen
Original-Tabelle customers:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
Abfrage:
SELECT name, COALESCE(address, 'Nicht angegeben') AS address
FROM customers;
Ergebnis:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | Nicht angegeben |
| Anna Song | 456 Oak Ave |
| Otto Art | Nicht angegeben |
| Liam Park | 789 Pine Rd |
Beispiel 2: Daten für Reports vorbereiten
Original-Tabelle sales:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
Abfrage:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
Ergebnis:
| total_sales |
|---|
| 650 |
Typische Fehler beim Einsatz von COALESCE()
Auch wenn COALESCE() einfach und universell wirkt, gibt’s ein paar Stolperfallen.
Datentypen nicht passend. Alle Argumente, die du an COALESCE() übergibst, müssen vom Datentyp her zusammenpassen. Zum Beispiel kannst du keine Strings und Zahlen mischen.
-- Fehler
SELECT COALESCE(salary, 'Nicht angegeben') FROM employees;
-- salary ist ein Zahlenfeld, aber 'Nicht angegeben' ist ein Text.
Reihenfolge der Argumente ignorieren. COALESCE() gibt immer das erste nicht-NULL zurück, also ist die Reihenfolge der Argumente wichtig.
GO TO FULL VERSION