本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
IN 條件
IN 條件會檢定值是否隸屬於一組值或子查詢。
語法
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,且不會傳回任何資料列:如果表達式產生 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、INTEGER、、BIGINT、REAL、、DOUBLEPRECISIONBOOLEAN、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)