Postgres ist die Datenbank
Kann ich einen NULL-Wert für eine IN-Klausel verwenden? Beispiel:
SELECT *
FROM tbl_name
WHERE id_field IN ('value1', 'value2', 'value3', NULL)
Ich möchte mich auf diese vier Werte beschränken.
Ich habe die obige Anweisung ausprobiert und sie funktioniert nicht. Sie wird ausgeführt, fügt jedoch keine Datensätze mit NULL id_fields hinzu.
Ich habe auch versucht, eine ODER-Bedingung hinzuzufügen, aber dadurch wird die Abfrage ausgeführt und ausgeführt, ohne dass ein Ende in Sicht ist.
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN ('value1', 'value2', 'value3')
OR id_field IS NULL
Irgendwelche Vorschläge?
sql
postgresql
null
conditional-statements
in-clause
Phill Pafford
quelle
quelle
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.where
Klausel?Antworten:
( Kommentar von Marc B )
Ich würde das aus Hellsichtigkeit tun
SELECT * FROM tbl_name WHERE (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
quelle
Ihre Abfrage schlägt aufgrund der Priorität des Operators fehl .
AND
bindet vorherOR
!Sie benötigen ein Paar Klammern, was keine Frage der "Klarheit" ist, sondern eine reine logische Notwendigkeit .
SELECT * FROM tbl_name WHERE other_condition = bar AND another_condition = foo AND (id_field IN ('value1', 'value2', 'value3') OR id_field IS NULL)
Die hinzugefügten Klammern verhindern die vorherige
AND
BindungOR
. Wenn es keine anderenWHERE
BedingungenAND
gäbe (nein ), würden Sie keine Klammern benötigen . Die akzeptierte Antwort ist in dieser Hinsicht etwas irreführend.quelle
SELECT * FROM tbl_name WHERE coalesce(id_field,'unik_null_value') IN ('value1', 'value2', 'value3', 'unik_null_value')
Damit entfernen Sie die Null aus der Prüfung. Bei einem Nullwert in id_field würde die Koaleszenzfunktion anstelle von Null 'unik_null_value' zurückgeben, und durch Hinzufügen von 'unik_null_value zur IN-Liste würde die Abfrage Beiträge zurückgeben, bei denen id_field den Wert 1-3 oder null hat.
quelle
Die Frage, wie sie von Daniel beantwortet wurde, ist vollkommen in Ordnung. Ich wollte eine Notiz bezüglich NULLS hinterlassen. Wir sollten vorsichtig sein, wenn Sie den Operator NOT IN verwenden, wenn eine Spalte NULL-Werte enthält. Sie erhalten keine Ausgabe, wenn Ihre Spalte NULL-Werte enthält und Sie den Operator NOT IN verwenden. So wird es hier erklärt http://www.oraclebin.com/2013/01/beware-of-nulls.html , ein sehr guter Artikel, auf den ich gestoßen bin und den ich teilen wollte.
quelle
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 intable b
existierttable a
oder nicht, und sein Verhalten herausfinden, wenn die Spaltenull
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 Werttable_b
anhand desIN
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 eintable_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 einennull
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 nachtrue
oder auswertenfalse
. Aber mein dritter Operanda = null
wird weder bewertentrue
nochfalse
. Es wird nur ausgewertetnull
.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 alstrue
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 denNOT 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 denNOT IN
Operator verwenden.Vorsicht vor NULL !!
quelle
Ich weiß, dass die Antwort zu spät ist, aber für andere nützlich sein könnte. Sie können eine Unterabfrage verwenden und die Null in 0 konvertieren
SELECT * FROM (SELECT CASE WHEN id_field IS NULL THEN 0 ELSE id_field END AS id_field FROM tbl_name) AS tbl WHERE tbl.id_field IN ('value1', 'value2', 'value3', 0)
quelle
Null
bezieht sich auf ein Fehlen von Daten.Null
wird formal als ein Wert definiert, der nicht verfügbar, nicht zugewiesen, unbekannt oder nicht anwendbar ist (OCA Oracle Database 12c, SQL Fundamentals I-Prüfungshandbuch, S. 87). Daher werden möglicherweise keine Datensätze mit Spalten angezeigt, die Nullwerte enthalten, wenn diese Spalten mithilfe einer "in" - oder "not in" -Klausel eingeschränkt werden.quelle