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 |
