- カテゴリ:
[ NOT ] IN¶
引数が明示的リストのメンバーの1つであるか、サブクエリの結果であるかをテストします。
注釈
サブクエリ形式では、 IN は = ANY と同等で、 NOT IN は <> ALL と同等です。
Tip
検索最適化サービスを使用すると、この関数を呼び出すクエリのパフォーマンスを向上させることができます。詳細については、 Search optimization service をご参照ください。
構文¶
個々の値を比較するには、
<value> [ NOT ] IN ( <value_1> [ , <value_2> ... ] )
行コンストラクター (括弧で囲まれた値のリスト)を比較するには、
( <value_A> [, <value_B> ... ] ) [ NOT ] IN ( ( <value_1> [ , <value_2> ... ] ) [ , ( <value_3> [ , <value_4> ... ] ) ... ] )
値をサブクエリによって返される値と比較するには、
<value> [ NOT ] IN ( <subquery> )
パラメーター¶
value検索する値。
value_A、value_B検索する行コンストラクターの要素。
IN の右側の各値(例えば、
(value3, value4))が、 IN の左側の値(例えば、(value_A, value_B))と同じ要素数を持つようにします。value_#valueを比較する必要がある値。比較する値が行コンストラクターの場合、各
value_#は行コンストラクターの個々の要素です。subqueryvalueと比較できる値のリストを返すサブクエリ。
使用上の注意¶
As in most contexts, NULL is not equal to NULL. If
valueis NULL, then the return value of the function is NULL, whether or not the list or subquery contains NULL. See NULL の使用.構文的には、 IN は関数ではなく演算子として扱われます。この例では、 IN を演算子として使う場合と、
f()を関数として呼び出す場合の違いを示しています。SELECT f(a, b), x IN (y, z) ...
You can't use function syntax with IN. For example, you can't rewrite the preceding example as:
SELECT f(a, b), IN(x, (y, z)) ...
IN は、 サブクエリ演算子 とも見なされます。
IN を使用するクエリでは、スプレッド演算子(
**)を使用することで、 配列 を個々の値のリストに展開することができます。詳細情報と例については、 展開演算子 をご参照ください。
照合順序の詳細¶
Arguments with collation specifications currently aren't supported.
例¶
以下の例では、 IN 関数を使用しています。
単純なリテラルでの IN の使用¶
次の例は、単純なリテラルで IN と NOT IN を使用する方法を示しています。
SELECT 1 IN (1, 2, 3) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
サブクエリでの IN の使用¶
これらの例は、 IN をサブクエリで使用する方法を示しています。
SELECT 'a' IN (
SELECT column1 FROM VALUES ('b'), ('c'), ('d')
) AS RESULT;
+--------+
| 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);
次の例は、テーブルの単一列で 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;
+-------+-------+-------+
| 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));
+-------+-------+-------+
| 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;
+--------+
| 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;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
NULL ではなく、 1 を選択するようにクエリを変更すると、 TRUE が返されることに注意してください。
SELECT 1 IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
この場合、 1 が IN リストに一致しているので、結果は TRUE となります。IN リストに NULL も存在するという事実は、結果には影響しません。
同様に、 NULL との NOT IN の比較も、リスト内のいずれかの値が NULL の場合、 NULL を返します。
SELECT 1 NOT IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
同じ動作は次のクエリにも当てはまり、 4, 5, NULL の値のセットは、 4, 5, NULL または 7, 8, 9 のどちらにも*一致しません*。
SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
次の例は、 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;
+--------+
| 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 |
+--------+