205

PostgreSQL中的IN和运算符有什么区别? 两者的工作机制似乎是一样的。任何人都可以用一个例子来解释这个吗?ANY

4

2 回答 2

285

(严格来说INANY不是 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 回答