Kategorien:

Funktionen für bedingte Ausdrücke

[ 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> ...  ] )
Copy

So vergleichen Sie Zeilenkonstruktoren (Wertelisten in Klammern):

( <value_A> [, <value_B> ... ] ) [ NOT ] IN (  ( <value_1> [ , <value_2> ... ] )  [ , ( <value_3> [ , <value_4> ... ] )  ...  ]  )
Copy

So vergleichen Sie einen Wert mit den von einer Unterabfrage zurückgegebenen Werten:

<value> [ NOT ] IN ( <subquery> )
Copy

Parameter

value

Der Wert, nach dem gesucht werden soll.

value_A, value_B

Die 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.

subquery

Eine 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 value NULL 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) ...
    
    Copy

    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)) ...
    
    Copy
  • 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;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
Copy
+--------+
| 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;
Copy
+--------+
| 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);
Copy

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;
Copy
+-------+-------+-------+
| 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));
Copy
+-------+-------+-------+
| 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;
Copy
+--------+
| 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;
Copy
+--------+
| 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;
Copy
+--------+
| 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;
Copy
+--------+
| 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;
Copy

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;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT NULL IN (SELECT val1 FROM in_list_table) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+
SELECT 3 IN (SELECT val1 FROM in_list_table) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+