本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
IN 條件
一個INcondition 會測試一組值或子查詢中的成員資格值。
語法
expression [ NOT ] IN (expr_list | table_subquery)
引數
- 運算式
-
數值、字元或日期時間 (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。
範例
只有這些列出的值,才會讓下列條件傳回 true:
qtysold in (2, 4, 5) date.day in ('Mon', 'Tues') date.month not in ('Oct', 'Nov', 'Dec')
大型 IN 清單的最佳化
為了實現最佳化的查詢效能,包含超過 10 個值的 IN 清單,會在內部轉換為純量陣列。包含不到 10 個值的 IN 清單,會轉換為一系列的 OR 述詞。SMALLINT、整數、大整數、實數、雙精度、布林值、字元、VARCHAR、日期、時間戳記和時間戳記資料類型支援此最佳化。
請檢視查詢的 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)