PostgreSQL中IN
和ANY
运算符之间有什么区别?
两者的工作机制似乎是一样的。任何人都可以用一个例子来解释这个吗?
答案 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
对列表不起作用,这使我迷住了几次。