- 类别:
[ 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
也被视为 子查询运算符。
排序规则详细信息¶
Arguments with collation specifications are currently not supported.
示例¶
将 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 与子查询一起使用¶
SELECT 'a' IN ( SELECT column1 FROM VALUES ('b'), ('c'), ('d') ) AS RESULT; +--------+ | RESULT | |--------| | False | +--------+
将 IN 与表一起使用¶
以下示例演示如何将 IN
与表一起使用。下面的语句创建示例中使用的表。
CREATE TABLE my_table (col_1 INTEGER, col_2 INTEGER, col_3 INTEGER); INSERT INTO my_table (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 my_table 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 my_table 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 my_table ) 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 | +--------+