カテゴリ:

条件式関数

[ NOT ] IN

引数が明示的リストのメンバーの1つであるか、サブクエリの結果であるかをテストします。

注釈

サブクエリ形式では、 IN は = ANY と同等で、 NOT IN は <> ALL と同等です。

Tip

検索最適化サービスを使用すると、この関数を呼び出すクエリのパフォーマンスを向上させることができます。詳細については、 検索最適化サービス をご参照ください。

構文

個々の値を比較するには、

<value> [ NOT ] IN ( <value_1> [ , <value_2> ...  ] )
Copy

行コンストラクター (括弧で囲まれた値のリスト)を比較するには、

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

値をサブクエリによって返される値と比較するには、

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

パラメーター

value

検索する値。

value_Avalue_B

検索する行コンストラクターの要素。

IN の右側の各値(例えば、 (value3, value4))が、 IN の左側の値(例えば、 (value_A, value_B))と同じ要素数を持つようにします。

value_#

value を比較する必要がある値。

比較する値が行コンストラクターの場合、各 value_# は行コンストラクターの個々の要素です。

subquery

value と比較できる値のリストを返すサブクエリ。

使用上の注意

  • ほとんどのコンテキストと同様に、 NULL は NULL と同等ではありません。 value が NULL の場合、リストまたはサブクエリに NULL が含まれているかどうかにかかわらず、関数の戻り値は NULL です。NULL の使用 を参照してください。

  • 構文的には、 IN は関数ではなく演算子として扱われます。この例では、 IN を演算子として使う場合と、 f() を関数として呼び出す場合の違いを示しています。

    SELECT
        f(a, b),
        x IN (y, z) ...
    
    Copy

    IN では関数構文は使用*できません*。たとえば、前述の例を次のように書き直すことはできません。

    SELECT
        f(a, b),
        IN(x, (y, z)) ...
    
    Copy
  • IN は、 サブクエリ演算子 とも見なされます。

  • IN を使用するクエリでは、スプレッド演算子(**)を使用することで、 配列 を個々の値のリストに展開することができます。詳細情報と例については、 展開演算子 をご参照ください。

照合順序の詳細

Arguments with collation specifications currently aren't supported.

以下の例では、 IN 関数を使用しています。

単純なリテラルでの IN の使用

次の例は、単純なリテラルで IN と NOT IN を使用する方法を示しています。

SELECT 1 IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

サブクエリでの IN の使用

これらの例は、 IN をサブクエリで使用する方法を示しています。

SELECT 'a' IN (
  SELECT column1 FROM VALUES ('b'), ('c'), ('d')
  ) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| False  |
+--------+

テーブルでの IN の使用

これらの例は、テーブルで IN を使用する方法を示しています。以下のステートメントは、例で使用されるテーブルを作成します。

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 を使用する方法を示しています。

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 を使用する方法を示しています。

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 を使用する方法を示しています。

SELECT (1, 2, 3) IN (
  SELECT col_1, col_2, col_3 FROM in_function_demo
  ) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

NULL の使用

NULL!=NULL であることに留意してください。IN とNOT IN リストで、NULL との比較を含む場合(等号条件を含む)、NULL が不明な値を表すため、予期せぬ結果が生じる可能性があります。NULL との比較は、TRUE や FALSE を返さず、NULL を返します。三項論理 もご参照ください。

例えば、以下のクエリは、TRUE ではなく NULL を返します。これは、SQL では、NULL が別の NULL を含む任意の値と等しいかどうかを判断できないためです。

SELECT NULL IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+

NULL ではなく、1 を選択するようにクエリを変更すると、TRUE が返されることに注意してください。

SELECT 1 IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

この場合、1 が IN リストに一致しているので、結果は TRUE となります。IN リストに NULL も存在するという事実は、結果には影響しません。

同様に、NULL との NOT IN の比較も、リスト内のいずれかの値が NULL の場合、NULL を返します。

SELECT 1 NOT IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL  |
+--------+

同じ動作は次のクエリにも当てはまり、4, 5, NULL の値のセットは、4, 5, NULL または 7, 8, 9 のどちらにも*一致しません*。

SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
Copy

次の例は、NULL の比較と同じ動作を示しているが、比較されるIN リスト値を定義するためにサブクエリを使用しています。

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   |
+--------+