von Markus Winand.

NULL in der Oracle Datenbank


Das Verhalten von NULL verursacht immer wieder Verwirrung. Obwohl die grundlegende Idee der NULLfehlende Daten zu repräsentieren – recht einfach ist, gibt es einige Besonderheiten. Anstatt des Ist-gleich-Operators (= NULL) muss man zum Beispiel IS NULL verwenden. Bei der Oracle Daten­bank gehen die „Besonderheiten“ aber noch weiter. Einerseits, weil sie NULL nicht immer so behandelt, wie es der Standard vorsieht. Andererseits aber auch, weil sie einen ganz „speziellen“ Umgang mit NULL in Indizes hat.

Der SQL-Standard definiert NULL nicht als Wert, sondern als Platzhalter für einen fehlenden Wert. Folgerichtig kann kein Wert NULL sein. Die Oracle Datenbank behandelt einen leeren String aber wie NULL:

   SELECT     '0 IS NULL???' AS "what is NULL?" FROM dual
    WHERE      0 IS NULL
UNION ALL
   SELECT    '0 is not null' FROM dual
    WHERE     0 IS NOT NULL
UNION ALL
   SELECT ''''' IS NULL???'  FROM dual
    WHERE    '' IS NULL
UNION ALL
   SELECT ''''' is not null' FROM dual 
    WHERE    '' IS NOT NULL
what is NULL?
--------------
0 is not null
'' IS NULL???

Um die Verwirrung zu vervollständigen, gibt es natürlich auch einen Fall, bei dem die Oracle Datenbank eine NULL wie einen leeren String behandelt:

SELECT dummy
     , dummy || ''
     , dummy || NULL
  FROM dual
D D D
- - -
X X X

Die Verbindung der Spalte DUMMY (immer mit 'X' gefüllt) mit NULL sollte NULL ergeben.

Das Konzept der NULL kommt in vielen Programmiersprachen vor. Aber egal wohin man blickt, ein leerer String ist niemals NULL. Ausgenommen bei der Oracle Datenbank. Hier ist es sogar unmöglich, einen leeren String in einem VARCHAR2-Feld abzuspeichern. Wenn man es versucht, wird einfach NULL gespeichert.

Diese Besonderheiten ist nicht nur merkwürdig, sondern sogar gefährlich. Insbesondere da die NULL-Kuriosität bei der Indizierung weitergeht.

Wenn dir gefällt, wie ich die Dinge erkläre, wirst du meine Kurse lieben.

Inhalt

  1. NULL im Index — Jeder Index ist ein partieller Index

  2. NOT NULL Constraints — beeinflussen die Indexnutzung

  3. Partielle Indizes emulieren — mit funktions-basierter Indizierung

Vorherige SeiteNächste Seite

Über den Autor

Foto von Markus Winand

Markus Winand lehrt effizientes SQL – inhouse und online. Er minimiert die Entwicklungszeit durch modernes SQL und optimiert die Laufzeit durch schlaue Indizierung – dazu hat er auch das Buch SQL Performance Explained veröffentlicht.

„Use The Index, Luke!“ von Markus Winand ist unter einer Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License lizenziert.
Impressum | Kontakt | KEINE GEWÄHR | Handelsmarken | Datenschutz | CC-BY-NC-ND 3.0 Lizenz