PostgreSQL中的IN
和运算符有什么区别?
两者的工作机制似乎是一样的。任何人都可以用一个例子来解释这个吗?ANY
问问题
193521 次
2 回答
285
(严格来说IN
,ANY
不是 Postgres 的“操作员”。而是“构造”或“语法元素”。)
从逻辑上讲,引用手册:
IN
相当于= ANY
。
但是有两个语法变体和IN
两个变体ANY
. 细节:
IN
采取set等同于= ANY
采取set,如下所示:
但是每个的第二个变体并不等同于另一个。构造的第二个变体ANY
采用一个数组(必须是一个实际的数组类型),而 的第二个变体IN
采用一个逗号分隔的值列表。这导致传递值的限制不同,在特殊情况下也可能导致不同的查询计划:
ANY
更通用
该ANY
构造更加通用,因为它可以与各种运算符组合,而不仅仅是=
. 例子:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
对于大量值,为每个值提供一组更好的比例:
有关的:
反转/相反/排除
“查找id
给定数组中的行”:
SELECT * FROM tbl WHERE id = ANY (ARRAY[1, 2]);
反转:“查找不在数组中的行” id
:
SELECT * FROM tbl WHERE id <> ALL (ARRAY[1, 2]);
SELECT * FROM tbl WHERE id <> ALL ('{1, 2}'); -- equivalent array literal
SELECT * FROM tbl WHERE NOT (id = ANY ('{1, 2}'));
三者等价。第一个带有数组构造函数,另外两个带有数组字面量。数据类型可以明确地从上下文中派生。否则,可能需要显式转换,例如'{1,2}'::int[]
.
行不通id IS NULL
过这些表达式中的任何一个。要另外包含NULL
值:
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
于 2016-01-06T07:21:39.380 回答
10
有两个明显的点,以及另一个答案中的点:
它们在使用子查询时是完全等价的:
SELECT * FROM table WHERE column IN(subquery); SELECT * FROM table WHERE column = ANY(subquery);
另一方面:
只有
IN
运算符允许一个简单的列表:SELECT * FROM table WHERE column IN(… , … , …);
ANY
假设它们完全一样,当我忘记了这不适用于列表时,我已经多次发现它们。
于 2020-02-16T07:51:20.140 回答