- Kategorien:
[ NOT ] IN¶
Prüft, ob das Argument auf einer expliziten Liste steht oder das Ergebnis einer Unterabfrage ist oder nicht.
Bemerkung
In der Unterabfrageform ist IN gleich = ANY und NOT IN gleich <> ALL.
Tipp
Sie können den Suchoptimierungsdienst verwenden, um die Leistung von Abfragen zu verbessern, die diese Funktion aufrufen. Weitere Details dazu finden Sie unter Suchoptimierungsdienst.
Syntax¶
So vergleichen Sie einzelne Werte:
<value> [ NOT ] IN ( <value_1> [ , <value_2> ... ] )
So vergleichen Sie Zeilenkonstruktoren (Wertelisten in Klammern):
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )
So vergleichen Sie einen Wert mit den von einer Unterabfrage zurückgegebenen Werten:
<value> [ NOT ] IN ( <subquery> )
Parameter¶
valueDer Wert, nach dem gesucht werden soll.
value_A,value_BDie Elemente eines Zeilenkonstruktors, nach denen gesucht werden soll.
Stellen Sie sicher, dass jeder Wert rechts von IN (z. B.
(value3, value4)) die gleiche Anzahl von Elementen hat wie der Wert links von IN (z. B.(value_A, value_B)).value_#Ein Wert, mit dem der
value-Wert verglichen werden soll.Wenn die Werte, mit denen verglichen werden soll, Zeilenkonstruktoren sind, dann ist jeder
value_#-Wert ein einzelnes Element eines Zeilenkonstruktors.subqueryEine Unterabfrage, die eine Liste von Werten zurückgibt, mit denen der
value-Wert verglichen werden kann.
Nutzungshinweise¶
Wie in den meisten Kontexten ist NULL nicht gleich NULL. Wenn
valueNULL ist, lautet der Rückgabewert der Funktion NULL, unabhängig davon, ob die Liste oder Unterabfrage NULL enthält. Siehe Verwenden von NULL.Syntaktisch wird IN als Operator und nicht als Funktion behandelt. Dieses Beispiel zeigt den Unterschied zwischen der Verwendung von IN als Operator und dem Aufruf von
f()als Funktion:SELECT f(a, b), x IN (y, z) ...
Sie können mit IN keine Funktionssyntax verwenden. Sie können zum Beispiel das vorherige Beispiel nicht umschreiben als:
SELECT f(a, b), IN(x, (y, z)) ...
IN wird auch als Unterabfrageoperator betrachtet.
In einer Abfrage, die IN verwendet, können Sie ein Array mithilfe des Spread-Operators (
**) in eine Liste von Einzelwerten erweitern. Weitere Informationen und Beispiele finden Sie unter Erweiterungsoperatoren.
Sortierungsdetails¶
Arguments with collation specifications currently aren’t supported.
Beispiele¶
Die folgenden Beispiele verwenden die Funktion IN.
Verwenden von IN mit einfachen Literalen¶
Die folgenden Beispiele veranschaulichen die Verwendung von IN und NOT IN mit einfachen Literalen:
SELECT 1 IN (1, 2, 3) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
Verwenden von IN mit einer Unterabfrage¶
Dieses Beispiel zeigt, wie Sie IN in einer Unterabfrage verwenden können.
SELECT 'a' IN (
SELECT column1 FROM VALUES ('b'), ('c'), ('d')
) AS RESULT;
+--------+
| RESULT |
|--------|
| False |
+--------+
Verwenden von IN mit einer Tabelle¶
In diesen Beispielen wird die Verwendung von IN mit einer Tabelle veranschaulicht: Mit der folgenden Anweisung wird die in den Beispielen verwendete Tabelle erstellt.
CREATE OR REPLACE TABLE in_function_demo (
col_1 INTEGER,
col_2 INTEGER,
col_3 INTEGER);
INSERT INTO in_function_demo (col_1, col_2, col_3) VALUES
(1, 1, 1),
(1, 2, 3),
(4, 5, NULL);
In diesem Beispiel wird die Verwendung von IN mit einer einzelnen Spalte einer Tabelle veranschaulicht:
SELECT col_1, col_2, col_3
FROM in_function_demo
WHERE (col_1) IN (1, 10, 100, 1000)
ORDER BY col_1, col_2, col_3;
+-------+-------+-------+
| COL_1 | COL_2 | COL_3 |
|-------+-------+-------|
| 1 | 1 | 1 |
| 1 | 2 | 3 |
+-------+-------+-------+
In diesem Beispiel wird die Verwendung von IN mit mehreren Spalten einer Tabelle veranschaulicht:
SELECT col_1, col_2, col_3
FROM in_function_demo
WHERE (col_1, col_2, col_3) IN (
(1,2,3),
(4,5,6));
+-------+-------+-------+
| COL_1 | COL_2 | COL_3 |
|-------+-------+-------|
| 1 | 2 | 3 |
+-------+-------+-------+
In diesem Beispiel wird die Verwendung von IN mit einer Unterabfrage veranschaulicht, die mehreren Spalten einer Tabelle ausliest:
SELECT (1, 2, 3) IN (
SELECT col_1, col_2, col_3 FROM in_function_demo
) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
Verwenden von NULL¶
Denken Sie daran, dass NULL != NULL. IN- und NOT IN-Listen, die Vergleiche mit NULL enthalten (einschließlich Gleichheitsbedingungen) zu unerwarteten Ergebnissen führen können, da NULL für einen unbekannten Wert steht. Vergleiche mit NULL geben nicht TRUE oder FALSE zurück. Sie geben NULL zurück. Siehe auch Ternäre Logik.
Die folgende Abfrage gibt zum Beispiel NULL, nicht TRUE zurück, weil SQL nicht bestimmen kann, ob NULL gleich einem beliebigen Wert, einschließlich eines anderen NULL-Werts, ist.
SELECT NULL IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
Beachten Sie: Wenn Sie die Abfrage ändern und 1 auswählen, nicht NULL, wird TRUE zurückgegeben:
SELECT 1 IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
In diesem Fall ist das Ergebnis TRUE, weil 1 eine Übereinstimmung in der IN-Liste hat. Die Tatsache, dass NULL auch in der IN-Liste existiert, hat keinen Einfluss auf das Ergebnis.
Ebenso geben NOT IN-Vergleiche mit NULL auch NULL zurück, wenn ein Wert in der Liste NULL ist.
SELECT 1 NOT IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
Das gleiche Verhalten gilt für die folgende Abfrage, bei der die Menge der Werte 4, 5, NULL nicht mit 4, 5, NULL oder 7, 8, 9 übereinstimmt:
SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
Das folgende Beispiel zeigt das gleiche Verhalten mit NULL-Vergleichen, verwendet aber eine Unterabfrage, um die IN-Listenwerte zu definieren, die verglichen werden:
CREATE OR REPLACE TABLE in_list_table (
val1 INTEGER,
val2 INTEGER,
val3 INTEGER
);
INSERT INTO in_list_table VALUES (1, 10, NULL), (2, 20, NULL), (NULL, NULL, NULL);
SELECT 1 IN (SELECT val1 FROM in_list_table) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
SELECT NULL IN (SELECT val1 FROM in_list_table) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
SELECT 3 IN (SELECT val1 FROM in_list_table) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+