类别:

条件表达式函数

[ 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_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) ...
    

    不能 使用函数语法来调用 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。包含与 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, NULL7, 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   |
+--------+