- 类别:
[ NOT ] IN¶
测试其实参是否是显式列表的成员之一或子查询的结果。
备注
在子查询形式中,IN 等效于 = ANY
,而 NOT IN 等效于 <> ALL
。
小技巧
您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 搜索优化服务。
语法¶
要比较各个值,请运行以下语句:
<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
可与之比较的值的列表。
使用说明¶
与在大多数上下文中一样,NULL 不等于 NULL。如果
value
为 NULL,则函数的返回值为 NULL,而无论列表或子查询是否包含 NULL。例如,以下语句返回 NULL 而不是 TRUE:
SELECT NULL IN (1, 2, NULL) AS RESULT;
在语法上,IN 被视为运算符而不是函数。本示例展示了使用 IN 作为运算符与将
f()
作为函数调用之间的区别:SELECT f(a, b), x IN (y, z) ...
不能 将函数语法与 IN 一起使用。例如,前面的示例不就能重写为:
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 左侧或右侧的值包含 NULL 时,以下查询均不会返回匹配项:
SELECT NULL IN (1, 2, NULL) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+
SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
+--------+
| RESULT |
|--------|
| NULL |
+--------+