it-swarm.com.de

null vs leere Zeichenfolge in Oracle

Mögliches Duplikat:
Warum behandelt Oracle 9i eine leere Zeichenfolge als NULL?

Ich habe eine Tabelle in Oracle 10g mit dem Namen TEMP_TABLE Mit nur zwei Spalten - id und description, nur zur Veranschaulichung.

Die Spalte id ist ein sequenzgenerierter Primärschlüssel vom Typ NUMBER(35, 0) not null und die Spalte DESCRIPTION ist ein Typ von VARCHAR2(4000) not null.

Die grundlegende Tabellenstruktur würde in diesem Fall ungefähr wie folgt aussehen.

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   | NOT NULL  | VARCHAR2(4000)|
+--------------+-----------+---------------+

Nach dem Erstellen dieser Tabelle versuche ich, alternativ die folgenden INSERT Befehle einzufügen.

INSERT INTO temp_table (id, description) VALUES (1, null); ->unsuccessful
INSERT INTO temp_table (id, description) VALUES (2, '');   ->unsuccessful

Beide sind als offensichtlich nicht erfolgreich, da die Einschränkung not null Für die Spalte DESCRIPTION erzwungen wird.

In beiden Fällen beschwert sich Oracle

ORA-01400: cannot insert NULL into ("WAGAFASHIONDB"."TEMP_TABLE"."DESCRIPTION")

Eine leere Zeichenfolge wird in Oracle als NULL -Wert behandelt.


Wenn ich die Einschränkung not null Für die Spalte DESCRIPTION verwerfen würde, würde die grundlegende Tabellenstruktur wie folgt aussehen

+--------------+-----------+---------------+
|Name          | Null?     | Type          |
+--------------+-----------+---------------+
|ID            | NOT NULL  | NUMBER(35)    |
|DESCRIPTION   |           | VARCHAR2(4000)|
+--------------+-----------+---------------+

und beide INSERT -Befehle, wie angegeben, wären erfolgreich. Sie würden zwei Zeilen erstellen, eine mit einem null -Wert und eine weitere mit einer leeren Zeichenfolge '' In der DESCRIPTION -Spalte von TEMP_TABLE.

Wenn ich nun den folgenden SELECT Befehl gebe,

SELECT * FROM temp_table WHERE description IS NULL;

dann werden beide Zeilen abgerufen, in denen eine einen null -Wert und die andere eine leere Zeichenfolge '' in der DESCRIPTION -Spalte enthält.

Die folgende SELECT -Anweisung ruft jedoch keine Zeilen aus dem TEMP_TABLE

SELECT * FROM temp_table WHERE description='';

Es wird nicht einmal die Zeile abgerufen, die eine leere Zeichenfolge in der Spalte DESCRIPTION enthält.


Vermutlich behandelt Oracle hier einen null -Wert und einen leeren String '' Unterschiedlich, was jedoch bei der INSERT -Anweisung, in der beide a Der Wert null und eine leere Zeichenfolge '' können nicht in eine Spalte mit der Einschränkung not null eingefügt werden. Wieso ist es so?

72
Tiny

Dies liegt daran, dass Oracle die leere Zeichenfolge intern in NULL-Werte ändert. Oracle lässt einfach keine leere Zeichenfolge einfügen.

Auf der anderen Seite lässt SQL Server Sie das tun, was Sie erreichen möchten.

Hier gibt es 2 Problemumgehungen:

  1. Verwenden Sie eine andere Spalte, in der angegeben ist, ob das Feld "Beschreibung" gültig ist oder nicht
  2. Verwenden Sie einen Dummy-Wert für das Feld 'description', in dem die leere Zeichenfolge gespeichert werden soll. (d. h. setzen Sie das Feld auf "Stackoverflowrocks", vorausgesetzt, Ihre realen Daten werden niemals auf einen solchen Beschreibungswert stoßen.)

Beides sind natürlich blöde Workarounds :)

88
Vaibhav Desai

In Oracle werden ein leeres varchar2 und null gleich behandelt, und Ihre Beobachtungen zeigen das.

wenn du schreibst:

select * from table where a = '';

es ist dasselbe wie Schreiben

select * from table where a = null;

und nicht a is null

das wird niemals wahr sein, also niemals eine Zeile zurückgeben. Wie beim Einfügen bedeutet NOT NULL, dass Sie keine Null oder eine leere Zeichenfolge einfügen können (was als Null behandelt wird).

28
DazzaL