

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# IN 条件
<a name="in_condition-spark"></a>

IN 条件测试一组值或一个子查询中的成员身份值。

## 语法
<a name="in_condition-synopsis"></a>

```
expression [ NOT ] IN (expr_list | table_subquery)
```

## 参数
<a name="in_condition-arguments"></a>

 *expression*   
数字、字符或日期时间表达式，针对 *expr\_list* 或 *table\_subquery* 进行计算，必须是与列表或子查询的数据类型兼容的。

 *expr\_list*   
一个或多个逗号分隔的表达式，或一组或多组逗号分隔的表达式（用括号限定）。

 *table\_subquery*   
一个子查询，计算结果为具有一行或多行的表，但在其选择列表中限制为一列。

IN \| NOT IN   
如果表达式是表达式列表或查询的成员，则 IN 将返回 true。如果表达式不是成员，NOT IN 将返回 true。在下列情况下，IN 和 NOT IN 将返回 NULL 并且不会返回任何行：如果 *expression* 生成 null；或者，如果没有匹配的 *expr\_list* 或 *table\_subquery* 值并且至少一个比较行生成 null。

## 示例
<a name="in_condition-examples"></a>

下列条件仅对列出的值有效：

```
qtysold in (2, 4, 5)
date.day in ('Mon', 'Tues')
date.month not in ('Oct', 'Nov', 'Dec')
```

## 优化大型 IN 列表
<a name="in_condition-optimization-for-large-in-lists"></a>

为了优化查询性能，包含 10 个以上的值的 IN 列表将在内部作为标量数组计算。少于 10 个值的 IN 列表将作为一系列 OR 谓词计算。SMALLINT、INTEGER、BIGINT、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE、TIMESTAMP 和 TIMESTAMPTZ 数据类型均支持此优化。

查看查询的 EXPLAIN 输出以查看此优化的效果。例如：

```
explain select * from sales
QUERY PLAN
--------------------------------------------------------------------
XN Seq Scan on sales  (cost=0.00..6035.96 rows=86228 width=53)
Filter: (salesid = ANY ('{1,2,3,4,5,6,7,8,9,10,11}'::integer[]))
(2 rows)
```