Lass uns mal über eine weitere Funktion sprechen, die mit dem mysteriösen NULL arbeitet — NULLIF(). Sie hilft dir in Situationen, in denen bestimmte Werte zu NULL gemacht werden sollen, damit du deine Daten korrekt verarbeiten kannst. Anschnallen, das wird eine spannende Reise!
Die Funktion NULLIF() ist ein super Tool in PostgreSQL, mit dem du zwei Werte vergleichen kannst. Sie gibt NULL zurück, wenn die Werte gleich sind, oder den ersten Wert, wenn sie unterschiedlich sind. Sie sagt quasi: "Wenn die Werte gleich sind, vergessen wir sie einfach!"
Hier ist die einfache Syntax der Funktion:
NULLIF(value1, value2)
Wenn value1 und value2 gleich sind, ist das Ergebnis NULL. Wenn sie unterschiedlich sind, bekommst du value1 zurück.
Beispiel:
SELECT NULLIF(10, 10); -- Ergebnis: NULL
SELECT NULLIF(10, 20); -- Ergebnis: 10
SELECT NULLIF('hello', 'hello'); -- Ergebnis: NULL
SELECT NULLIF('hello', 'world'); -- Ergebnis: 'hello'
Easy, oder? Jetzt lass uns mal schauen, wie man diese Funktion in echten Aufgaben einsetzen kann.
Beispiel 1: Division durch Null verhindern
Division durch Null ist der Albtraum jedes Programmierers. In SQL bekommst du einen Fehler, wenn du durch Null teilst. Genau hier kommt NULLIF() ins Spiel.
Stell dir vor, wir haben eine Tabelle sales mit zwei Spalten: revenue (Einnahmen) und expenses (Ausgaben). Wir wollen die Rentabilität der Ausgaben berechnen (revenue / expenses), aber manchmal sind die Ausgaben null. Wenn wir einfach so eine Query absetzen, gibt es einen Division-by-zero-Fehler.
Tabelle sales:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
Fehlerhafte Query:
SELECT revenue / expenses AS profitability
FROM sales;
-- Fehler: Division durch Null!
Lösung mit NULLIF():
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
Ergebnis:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
Jetzt, wenn expenses gleich 0 ist, gibt NULLIF(expenses, 0) NULL zurück, und Division durch NULL verursacht keinen Fehler, sondern gibt einfach NULL zurück.
Beispiel 2: Gleiche Werte durch NULL ersetzen
Stell dir vor, du hast eine Tabelle mit Studentendaten, mit den Spalten first_name und preferred_name. Manchmal bevorzugen Studierende ihren echten Namen, manchmal einen anderen. Wenn beide Namen gleich sind, macht es keinen Sinn, preferred_name anzuzeigen.
Tabelle students:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
Query mit NULLIF():
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
Ergebnis:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
Wenn preferred_name und first_name gleich sind, ist das Ergebnis NULL.
Beispiel 3: Daten filtern
Manchmal willst du nur die Zeilen auswählen, in denen die Werte in zwei Spalten unterschiedlich sind. Zum Beispiel gibt es eine Tabelle mit Bestellungen, mit original_price und discounted_price. Wir wollen die Bestellungen finden, bei denen ein Rabatt angewendet wurde.
Tabelle orders:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
Query mit NULLIF():
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
Ergebnis:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
Nur Bestellungen mit Rabatt landen im Ergebnis.
Praktische Use-Cases für NULLIF()
Case 1: Auswahl eines optionalen Werts
Beim Arbeiten mit Daten willst du manchmal einen Wert aus mehreren Spalten auswählen, aber bestimmte Werte ausschließen. Zum Beispiel haben wir eine Liste von Mitarbeitenden mit ihren Gehältern: base_salary und bonus. Wenn der Bonus 0 ist, wollen wir ihn auf 999 setzen.
Tabelle employees:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
Query mit NULLIF():
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
Ergebnis:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
Wenn bonus gleich 0 ist, wird er zu 999.
Case 2: Zeilen zählen
Wir können NULLIF() nutzen, um komplizierte Filterbedingungen zu vereinfachen. Zum Beispiel gibt es eine Tabelle mit Usern und wir wollen in einer Query sowohl die Gesamtzahl als auch die Zahl der registrierten User (ohne Status guest) herausfinden.
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
So kannst du mit nur einer Funktion NULLIF() viele Aufgaben lösen: von Fehlervermeidung bis zu besserer Lesbarkeit deines Codes. Jetzt, wo du weißt, wie sie funktioniert, bist du schon einen Schritt näher am Daten-Profi in PostgreSQL.
GO TO FULL VERSION