IN与PostgreSQL中的ANY运算符

PostgreSQL中INANY操作符的区别是什么?< br > 两者的工作机制似乎是一样的。有人能举个例子解释一下吗?< / p >
258253 次浏览

(严格来说,INANY是Postgres的“构造”。或者“语法元素”,而不是“操作符”。)

逻辑上<强> < / >强 引用手册:

IN等价于= ANY

但是有两个IN<强>语法变异< / >强和两个ANY的变体。细节:

IN set等价于= ANY,如下所示:

但两者的第二种变体略有不同。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}'));

三个都是等价的。第一个用数组构造函数,另外两个用数组中文字无类型数组字面值的类型是从左边的(已知)元素类型派生出来的。
在其他星座中(类型化的数组值/您想为非默认类型使用不同的类型/ array构造函数),您可能需要显式强制转换

带有id IS NULL的行不会传递这两个表达式中的任何一个。要额外包含NULL值:

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;

这里有两个明显的观点,和另一个答案中的观点一样:

  • 当使用子查询时,它们是完全等效的:

    SELECT * FROM table
    WHERE column IN(subquery);
    
    
    SELECT * FROM table
    WHERE column = ANY(subquery);
    

On the other hand:

  • Only the IN operator allows a simple list:

    SELECT * FROM table
    WHERE column IN(… , … , …);
    

Presuming they are exactly the same has caught me out several times when forgetting that ANY doesn’t work with lists.