Kurs: SQL

7.1.3 Der Vergleich mit dem Wert NULL

Eine besondere Stellung nimmt der Wert NULL ein. Semantisch bedeutet NULL "fehlender" oder "unbekannter Wert". Wie aber sieht ein Vergleichsoperator in Kombination mit einem NULL-Wert aus?

In unserer Kundentabelle existiert ein Eintrag mit einem NULL-Wert für das Datum. Wird in einer SELECT-Anfrage dieser Wert mittels eines Vergleichsoperators mit einem anderen Wert verglichen, so ist das Ergebnis UNKNOWN. Nehmen wir an, dass der Geburtstag von Edgar Polak noch nicht bekannt ist und somit als Wert NULL eingetragen wurde.

Kunden

Kunden-nummer

Name

Vorname

Geburtstag

Geschlecht

Adresse

33

Betz

Stefan

3.6.1990

M

Karl-Marx-Str. 20

45

Polak

Edgar

NULL

M

8989 Hotel Heartbeat, Salem

35

Kampinski

Igor

2.5.1963

M

Frankfurter Str. 22

59

Mayer

Karl

4.6.1976

M

Insel am Meer 19, 10788 Berlin

70

Lessing

Katrin

5.7.1991

F

Görlitzer Platz 45

109

Casper

Martha

2.10.1992

F

Kreuzberg Str. 12

128

Schreiber

Tobias

6.7.1980

M

Hertzstr. 5

Beispiel:

SELECT * FROM Kunden
WHERE Geburtstag >= '1.1.1990';

Ergebnis:

Kunden-nummer

Name

Vorname

Geburtstag

Geschlecht

Adresse

33

Betz

Stefan

3.6.1990

M

Karl-Marx-Str. 20

70

Lessing

Katrin

5.7.1991

F

Görlitzer Platz 45

109

Casper

Martha

2.10.1992

F

Kreuzberg Str. 12

Edgar Polaks Geburtstag ist nicht bekannt und fällt bei dem Vergleich mit dem Datum '1.1.1990' heraus. Andererseits ist Vorsicht geboten, falls NULL selbst als Vergleichswert mit den Vergleichsoperatoren verwendet wird. Möchte man beispielsweise alle Datensätze auflisten, bei denen die Geburtstage unbekannt sind, so führt folgende Anfrage nicht zum gewünschten Ergebnis:

SELECT * FROM Kunden
WHERE Geburtstag = NULL;

Sie liefert für alle Datensätze den Wert FALSE. Viele Hersteller bieten stattdessen die Operatoren IS NULL oder IS NOT NULL.

SELECT * FROM Kunden
WHERE Geburtstag IS NULL;

liefert

Kunden-nummer

Name

Vorname

Geburtstag

Geschlecht

Adresse

45

Polak

Edgar

NULL

M

8989 Hotel Heartbeat, Salem



SELECT * FROM Kunden
WHERE Geburtstag IS NOT NULL;

ergibt:

Kunden-nummer

Name

Vorname

Geburtstag

Geschlecht

Adresse

33

Betz

Stefan

3.6.1990

M

Karl-Marx-Str. 20

35

Kampinski

Igor

2.5.1963

M

Frankfurter Str. 22

59

Mayer

Karl

4.6.1976

M

Insel am Meer 19. 10788 Berlin

70

Lessing

Katrin

5.7.1991

F

Görlitzer Platz 45

109

Casper

Martha

2.10.1992

F

Kreuzberg Str. 12

128

Schreiber

Tobias

6.7.1980

M

Hertzstr. 5

Manchmal ist es dennoch wichtig, einen Datensatz mit einem unbekannten Wert zu berücksichtigen. Oracle bietet hierzu die Funktion NVL() an. NVL() gibt einen Ersatzwert zurück, falls der zu vergleichende Wert NULL ist.

Betrachten wir unser obiges Beispiel:

SELECT * FROM Kunden
WHERE NVL(Geburtstag,'6.6.1990') >= '1.1.1990';

Der Ersatzwert '6.6.1990' liegt nach '1.1.1990'. Dies bewirkt, dass der Datensatz mit NULL für die Bedingungsprüfung diesen Wert erhält und damit auch die Bedingung erfüllt. Der Datensatz wird in die Ergebnismenge aufgenommen. Der Wert in der Spalte ändert sich natürlich nicht dadurch; für die Ausgabe wird also der Wert NULL angezeigt.

Ergebnis:

Kunden-nummer

Name

Vorname

Geburtstag

Geschlecht

Adresse

33

Betz

Stefan

3.6.1990

M

Karl-Marx-Str. 20

45

Polak

Edgar

NULL

M

8989 Hotel Heartbeat, Salem

70

Lessing

Katrin

5.7.1991

F

Görlitzer Platz 45

109

Casper

Martha

2.10.1992

F

Kreuzberg Str. 12