Die leere Oracle-Zeichenfolge wird in null konvertiert

7

Beim Einfügen wird eine leere Zeichenfolge in null konvertiert:

insert into test (f) values ('');

Jetzt gibt es eine Zeile mit f, die eine Null enthält.

Wenn ich die Tabelle abfrage, kann ich jedoch nicht '' verwenden:

select * from test where f='';
no rows selected

Ich kann null verwenden:

select * from test where f is null;
____F_
NULL

Es scheint also, dass Oracle entschieden hat, dass leere Zeichenfolgen nicht zum Einfügen verwendet werden können, aber bei Abfragen leere Zeichenfolgen bleiben. Wo ist die Dokumentation darüber, wann eine leere Zeichenfolge zu einer Null wird und wann sie eine leere Zeichenfolge bleibt?

Kainaw
quelle
Siehe auch
AlikElzin-kilaka
1
" Wo ist die Dokumentation? " - docs.oracle.com/database/121/SQLRF/…
a_horse_with_no_name

Antworten:

8

Das sagt alles:

select NVL('','it is null') as value
from dual;

SQL Fiddle

2 Dinge:

1) ''wird NULLbeim Einfügen in konvertiert . Das ist eine Oracle- VARCHAR2Sache.

2) select * from test where f='';versucht zu tun select * from test where f=NULL, was nicht definiert ist, und gibt nichts zurück, weil NULLder Gleichheitsoperator nicht gefällt. Sie müssen IS NULLoder verwenden IS NOT NULL.

Ich werde hinzufügen, dass sich der CHARDatentyp anders verhält, weil er aufgefüllt ist.

Philᵀᴹ
quelle
Oracle behandelt leere Zeichenfolgen '' als NULL.
Tarun Kumar
6

Oracle behandelt '' und NULL gleich. Beim Einfügen von '' erfolgt keine Konvertierung von '' in NULL, sondern lediglich eine Interpretation von '', so wie NULLdas Wort NULL als interpretiert wird NULLoder rtrim ('a', 'a') als interpretiert wird NULL.

Hier ist eine Demonstration anhand der folgenden Tabelle und Einfügung:

drop table t1;
create table t1 (c1 varchar2(10));
insert into t1 (c1) values ('');

Die obige Einfügung fügte einen NULL-Wert für c1 ein. Sie können diese Zeile wie folgt auswählen:

SELECT c1 FROM t1;

Wenn Sie eine WHERE-Klausel hinzufügen, um die Gleichheit zu vergleichen, und einer der verglichenen Werte NULL ist, ist das Ergebnis immer unbekannt. Unbekannt wird als falsch ausgewertet, außer dass weitere Operationen mit einem unbekannten Wert unbekannte Werte erzeugen. Alle folgenden geben keine Zeilen zurück, da die WHERE-Klauseln Bedingungen enthalten, die unabhängig von den Daten niemals wahr sind.

SELECT c1 FROM t1 WHERE c1 = '';
SELECT c1 FROM t1 WHERE c1 = NULL;
SELECT c1 FROM t1 WHERE '' = '';
SELECT c1 FROM t1 WHERE NULL = NULL;

Oracle bietet eine spezielle Syntax zum Abrufen von Zeilen mit einer bestimmten Spalte mit Nullwerten - IS NULL.

SELECT c1 FROM t1 WHERE c1 IS NULL;

Es gibt einige Bedingungen, unter denen Oracle NULL vergleicht und sie als gleichwertig mit anderen NULL-Werten behandelt, z. B. in DECODE-Anweisungen und in zusammengesetzten Schlüsseln.

Weitere Informationen finden Sie in der SQL-Sprachreferenz .

Leigh Riffel
quelle
Sorry Leigh, schrieb Antworten zur gleichen Zeit :)
Philᵀᴹ
@Phil Ich mochte deine Antwort. Es war direkt und klar. Was ich sehe, ist kein Problem mit '' und NULL. Es handelt sich um ein Problem mit = NULL und IS NULL.
Kainaw
@Phil Kein Problem. Ich denke, Sie haben den wahren Kern der Verwirrung angesprochen.
Leigh Riffel
-1

Oracle RDBMS macht keine Unterschiede zwischen null und leeren Zeichenfolgen. Dies bedeutet, dass es keine Transformation gibt, um eine leere Zeichenfolge in einen Nullwert umzuwandeln.

Ich kann verstehen, dass keine der 2 Informationen enthält.

Nicolas Durand
quelle
Das kann nicht wahr sein. Es muss eine Konvertierung durchgeführt werden. Wenn ich ein '' einfüge und keine Konvertierung erfolgt, kann ich ein '' auswählen. Aber ich kann nicht. Ich muss eine NULL auswählen, um das von mir eingefügte '' zu erhalten.
Kainaw
1
Sie erhalten keine Ergebnisse mit WHERE f= ''aus dem gleichen Grund, aus dem Sie keine Ergebnisse erhalten WHERE f=NULL. In Oracle ''und NULLsind gleich, so dass beide als falsch ausgewertet werden.
Leigh Riffel
Oracle konvertiert Varchare mit der Länge Null in NULL-Werte. Wenn Sie Ihre Tabelle mit f not nullEinschränkungen erstellen, schlägt das Einfügen mit dem Fehler "NULL kann nicht eingefügt werden" fehl.
Mindaugas Riauba
@LeighRiffel Ihre Antwort basiert auf einem falschen Lesen der Ergebnisse. Bei Verwendung von '' erhalten Sie keine Ergebnisse. Wenn Sie NULL verwenden, erhalten Sie ein Ergebnis mit NULL. Es gibt einen großen Unterschied zwischen dem Erhalten eines Ergebnisses und dem Erhalten eines Datensatzes mit einer NULL. Stellen Sie sich vor, es gäbe zwei Spalten. Mit '' erhalten Sie keine Datensätze. Mit NULL erhalten Sie den Wert aus der ersten Spalte und einen NULL-Wert für die zweite - was nicht "kein Datensatz" ist.
Kainaw
@MindaugasRiauba Im obigen Beispiel habe ich gezeigt, dass Oracle bei Einfügebefehlen '' in NULL konvertiert. Bei ausgewählten Befehlen wird '' nicht in NULL konvertiert. Die Aussage "Oracle konvertiert '' in NULL" ist also nicht ganz richtig.
Kainaw
-3

Das erklärt es ein wenig:

create table t1 (c1 char(1),
                 c2 char(3),
                 c3 varchar2(10));


insert into t1 values ('','','');
insert into t1 values ('a','a','a');

declare 
v1 char(1);
begin
v1 := '';
insert into t1 values (v1,v1,v1);
end;

select * from t1;

select count(c1) from t1;
select count(c2) from t1;
select count(c3) from t1;

select length(c1), length(c2), length(c3) from t1;
user107450
quelle
Hallo, willkommen auf der Seite. Können Sie erklären, wie Ihr Code funktioniert und wie er die Frage des OP erklärt?
Tom V - versuchen Sie topanswers.xyz