Zum Inhalt springen

NULL-Werte

NULL-Werte sind besondere Werte, die in SQL fehlende Daten darstellen. Spalten jedes Typs können NULL-Werte enthalten. Logisch kann ein NULL-Wert als „der Wert dieses Feldes ist unbekannt“ verstanden werden.

Ein NULL-Wert kann in jedes Feld eingefügt werden, das nicht den Qualifier NOT NULL hat:

CREATE TABLE integers (i INTEGER);
INSERT INTO integers VALUES (NULL);

NULL-Werte haben in vielen Teilen der Abfrage sowie in vielen Funktionen eine besondere Semantik:

Jeder Vergleich mit einem NULL-Wert liefert NULL, einschließlich NULL = NULL.

Sie können IS NOT DISTINCT FROM verwenden, um einen Gleichheitsvergleich durchzuführen, bei dem NULL-Werte untereinander als gleich gelten. Mit IS (NOT) NULL prüfen Sie, ob ein Wert NULL ist.

SELECT NULL = NULL;
NULL
SELECT NULL IS NOT DISTINCT FROM NULL;
true
SELECT NULL IS NULL;
true

NULL und Funktionen

Eine Funktion, die ein Eingabeargument NULL hat, liefert in der Regel NULL.

SELECT cos(NULL);
NULL

Die Funktion coalesce ist eine Ausnahme: Sie nimmt eine beliebige Anzahl von Argumenten und liefert für jede Zeile das erste Argument, das nicht NULL ist. Sind alle Argumente NULL, liefert coalesce ebenfalls NULL.

SELECT coalesce(NULL, NULL, 1);
1
SELECT coalesce(10, 20);
10
SELECT coalesce(NULL, NULL);
NULL

Die Funktion ifnull ist eine Zwei-Argument-Variante von coalesce.

SELECT ifnull(NULL, 'default_string');
default_string
SELECT ifnull(1, 'default_string');
1

NULL und AND / OR

NULL-Werte verhalten sich in Verbindung mit AND und OR besonders. Details finden Sie in der Dokumentation zum Boolean-Typ.

NULL und IN / NOT IN

Das Verhalten von ... IN ⟨something with a NULL⟩{:.language-sql .highlight} unterscheidet sich von ... IN ⟨something with no NULLs⟩{:.language-sql .highlight}. Details finden Sie in der IN-Dokumentation.

NULL und Aggregatfunktionen

NULL-Werte werden in den meisten Aggregatfunktionen ignoriert.

Aggregatfunktionen, die NULL-Werte nicht ignorieren, sind unter anderem: first, last, list und array_agg. Um NULL-Werte aus diesen Aggregatfunktionen auszuschließen, kann die FILTER-Klausel verwendet werden.

CREATE TABLE integers (i INTEGER);
INSERT INTO integers VALUES (1), (10), (NULL);
SELECT min(i) FROM integers;
1
SELECT max(i) FROM integers;
10