IN 条件
IN 条件测试一组值或一个子查询中的成员值。
语法
expression [ NOT ] IN (expr_list | table_subquery)
参数
- 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。
示例
下列条件仅对列出的值有效:
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、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)