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 回答