Hinweis: Da jemand behauptet hat, der externe Link sei in Sushant Buttas Antwort tot , habe ich den Inhalt hier als separate Antwort veröffentlicht.
Vorsicht vor Nullen .
Heute bin ich bei der Verwendung von IN und NOT IN
Operatoren auf ein sehr seltsames Abfrageverhalten gestoßen . Eigentlich wollte ich zwei Tabellen vergleichen und herausfinden, ob ein Wert von in table b
existiert table a
oder nicht, und sein Verhalten herausfinden, wenn die Spalte null
Werte enthält . Also habe ich gerade eine Umgebung erstellt, um dieses Verhalten zu testen.
Wir werden eine Tabelle erstellen table_a
.
SQL> create table table_a ( a number);
Table created.
Wir werden eine Tabelle erstellen table_b
.
SQL> create table table_b ( b number);
Table created.
Fügen Sie einige Werte in ein table_a
.
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
Fügen Sie einige Werte in ein table_b
.
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
Jetzt führen wir eine Abfrage aus, um die Existenz eines Werts zu überprüfen, table_a
indem wir dessen Wert table_b
anhand des IN
Operators überprüfen .
SQL> select * from table_a where a in (select * from table_b);
A
3
Führen Sie die folgende Abfrage aus, um die Nichtexistenz zu überprüfen.
SQL> select * from table_a where a not in (select * from table_b);
A
1
2
Die Ausgabe kam wie erwartet. Jetzt fügen wir einen null
Wert in die Tabelle ein table_b
und sehen, wie sich die beiden obigen Abfragen verhalten.
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
Die erste Abfrage hat sich wie erwartet verhalten, aber was ist mit der zweiten Abfrage passiert? Warum haben wir keine Ausgabe bekommen, was hätte passieren sollen? Gibt es einen Unterschied in der Abfrage? Nein .
Die Änderung ist in den Daten der Tabelle table_b
. Wir haben einen null
Wert in die Tabelle eingefügt. Aber warum verhält es sich so? Lassen Sie uns die beiden Abfragen in "AND"
und "OR"
Operator aufteilen .
Erste Abfrage:
Die erste Abfrage wird intern in etwa so behandelt. A null
wird hier also kein Problem verursachen, da meine ersten beiden Operanden entweder nach true
oder auswerten false
. Aber mein dritter Operand a = null
wird weder bewerten true
noch false
. Es wird nur ausgewertet null
.
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
Zweite Abfrage:
Die zweite Abfrage wird wie folgt behandelt. Da wir einen "AND"
Operator verwenden und alles andere als true
in einem der Operanden, wird mir keine Ausgabe gegeben.
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
Wie gehen wir damit um? Wir werden alle not null
Werte aus der Tabelle auswählen, table_b
während wir den NOT IN
Operator verwenden.
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
1
2
Seien Sie also immer vorsichtig mit den NULL
Werten in der Spalte, wenn Sie den NOT IN
Operator verwenden.
Vorsicht vor NULL !!
in
Anweisung wird identisch mit analysiertfield=val1 or field=val2 or field=val3
. Wenn Sie dort eine Null eingeben, läuft es darauf hinaus,field=null
was nicht funktioniert.