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 INOperatoren auf ein sehr seltsames Abfrageverhalten gestoßen . Eigentlich wollte ich zwei Tabellen vergleichen und herausfinden, ob ein Wert von in table bexistiert table aoder nicht, und sein Verhalten herausfinden, wenn die Spalte nullWerte 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_aindem wir dessen Wert table_banhand des INOperators ü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 nullWert in die Tabelle ein table_bund 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 nullWert 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 nullwird hier also kein Problem verursachen, da meine ersten beiden Operanden entweder nach trueoder auswerten false. Aber mein dritter Operand a = nullwird weder bewerten truenoch 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 truein 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 nullWerte aus der Tabelle auswählen, table_bwährend wir den NOT INOperator 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 NULLWerten in der Spalte, wenn Sie den NOT INOperator verwenden.
Vorsicht vor NULL !!
inAnweisung wird identisch mit analysiertfield=val1 or field=val2 or field=val3. Wenn Sie dort eine Null eingeben, läuft es darauf hinaus,field=nullwas nicht funktioniert.