PostgreSQL中的IN与ANY运算符

时间:2016-01-06 06:33:16

标签: sql database postgresql rdbms sql-in

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

2 个答案:

答案 0 :(得分:80)

逻辑 quoting the manual

  

IN相当于= ANY

IN有两个 语法变体 ANY构造的两个变体。详细说明:

IN ()变体获取 相当于= ANY()获取,如下所示:

但每个的第二个变体等同于其他ANY构造的第二个变体采用数组(必须是实际数组类型),而IN的第二个变体采用逗号分隔的列表值即可。这导致传递值的限制不同, can 在特殊情况下也会导致不同的查询计划:

ANY结构更加通用,因为它可以与各种运算符结合使用,而不仅仅是=LIKE的示例:

SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');

对于大量值,提供可以更好地扩展每个值:

相关:

倒置/对立/排除

反转:

SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);

"在数组中找到id 的行" - 是:

SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);

与以下内容相同:

SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));

id IS NULL 的行不会传递其中任何一个表达式。另外包括NULL值:

SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;

答案 1 :(得分:3)

有两个明显的观点,以及另一个答案中的观点:

  • 使用子查询时,它们完全相同:

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

另一方面:

  • IN运算符允许一个简单列表:

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

假设它们完全相同,却忘记了ANY对列表不起作用,这使我迷住了几次。