

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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>

 *表達式*   
數值、字元或日期時間 (datetime) 表達式，會根據 *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>

只有這些列出的值，才會讓下列條件傳回 true：

```
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)
```