类别:

条件表达式函数

[ NOT ] IN

测试其实参是否是显式列表的成员之一或子查询的结果。

备注

在子查询形式中,IN 等效于 = ANY,而 NOT IN 等效于 <> ALL

小技巧

您可以使用搜索优化服务,提高用于调用此函数的查询的性能。有关详细信息,请参阅 搜索优化服务

语法

要比较各个值,请运行以下语句:

<value> [ NOT ] IN ( <value_1> [ , <value_2> ...  ] )
Copy

要比较 *行构造函数*(带括号的值列表),请运行以下语句:

( <value_A> [, <value_B> ... ] ) [ NOT ] IN (  ( <value_1> [ , <value_2> ... ] )  [ , ( <value_3> [ , <value_4> ... ] )  ...  ]  )
Copy

要将值与子查询返回的值进行比较,请运行以下语句:

<value> [ NOT ] IN ( <subquery> )
Copy

参数

value

要搜索的值。

value_Avalue_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;
    
    Copy
  • 在语法上,IN 被视为运算符而不是函数。本示例展示了使用 IN 作为运算符与将 f() 作为函数调用之间的区别:

    SELECT
        f(a, b),
        x IN (y, z) ...
    
    Copy

    不能 将函数语法与 IN 一起使用。例如,前面的示例不就能重写为:

    SELECT
        f(a, b),
        IN(x, (y, z)) ...
    
    Copy
  • IN 也被视为 子查询运算符

  • 在使用 IN 的查询中,可以使用展开运算符 (**) 将 数组 扩展为单个值组成的列表。有关更多信息和示例,请参阅 扩展运算符

排序规则详细信息

Arguments with collation specifications currently aren't supported.

示例

以下示例使用 IN 函数。

将 IN 与简单字面量一起使用

以下示例演示如何将 IN 和 NOT IN 与简单字面量一起使用:

SELECT 1 IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+
SELECT 4 NOT IN (1, 2, 3) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

将 IN 与子查询一起使用

这些示例展示了如何在子查询中使用 IN。

SELECT 'a' IN (
  SELECT column1 FROM VALUES ('b'), ('c'), ('d')
  ) AS RESULT;
Copy
+--------+
| 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);
Copy

此示例演示如何将 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;
Copy
+-------+-------+-------+
| 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));
Copy
+-------+-------+-------+
| 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;
Copy
+--------+
| RESULT |
|--------|
| True   |
+--------+

使用 NULL

请注意,NULL != NULL。当 IN 左侧或右侧的值包含 NULL 时,以下查询均不会返回匹配项:

SELECT NULL IN (1, 2, NULL) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+
SELECT (4, 5, NULL) IN ( (4, 5, NULL), (7, 8, 9) ) AS RESULT;
Copy
+--------+
| RESULT |
|--------|
| NULL   |
+--------+
语言: 中文