- 类别:
[ NOT ] IN¶
测试其实参是否是显式列表的成员之一或子查询的结果。
备注
在子查询形式中,IN 等效于 = ANY,而 NOT IN 等效于 <> ALL。
小技巧
您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 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_#都是行构造函数的单个元素。subquery一个子查询,返回
value可与之比较的值的列表。
使用说明¶
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。包含与 NULL 比较(包括相等条件)的列表的 IN 和 NOT IN 可能会产生意外结果,因为 NULL 表示一个未知值。与 NULL 的比较不会返回 TRUE 或 FALSE,它们会返回 NULL。另请参阅 三元逻辑。
例如,下面的查询返回 NULL,而不是 TRUE,因为 SQL 无法确定 NULL 是否等于任何值,包括另一个 NULL。
SELECT NULL IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
注意,如果将查询改为选择 1 而不是 NULL,它将返回 TRUE:
SELECT 1 IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| True |
+--------+
在这种情况下,结果是 TRUE,因为 1 确实在 IN 列表中有匹配项。NULL 也存在于 IN 列表中,但这不会影响结果。
类似地,如果列表中有任何值为 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;
下面的示例展示了使用子查询定义 IN 列表值进行比较时,NULL 比较的相同行为:
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 |
+--------+