PostgreSQL中的IN与ANY运算符

njthzxwz  于 2023-01-12  发布在  PostgreSQL
关注(0)|答案(3)|浏览(193)

INANY运算符在PostgreSQL中有什么区别?
两者的工作机制似乎是一样的,有没有人能用例子来解释一下?

zpqajqem

zpqajqem1#

(严格地说,INANY是Postgres的"构造"或"语法元素",而不是"运算符"。)

逻辑上,引用手册:

IN等于= ANY
但是IN有两个***语法变体***,ANY有两个变体。

  • 如何在WHERE子句中使用ANY代替IN?

IN取 * 集*等价于= ANY取 * 集 *,如下所示:

  • PostgreSQL-输入与任意

但是两者的第二个变体有细微的不同。ANY构造的第二个变体采用array(必须是实际的数组类型),而IN的第二个变体采用逗号分隔的值列表。这导致在传递值时有不同的限制,并且在特殊情况下 * 还可以 * 导致不同的查询计划:

ANY的功能更加丰富

ANY结构的通用性要高得多,因为它可以与各种运算符组合,而不仅仅是=

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

对于大量的值,提供一个 * set * 可以更好地为每个值缩放:

相关:

  • PostgreSQL可以索引数组列吗?

反转/相反/排除

  • "查找给定数组中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构造函数,另外两个使用数组常量。无类型数组常量的类型是从左边的(已知)元素类型派生的。
在其他配置中(类型化的数组值/您需要不同的类型/非默认类型的ARRAY构造函数),您可能需要显式强制转换。
带有**id IS NULL**的行不通过这两个表达式中的任何一个。要另外包括NULL值:

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

ljsrvy3e2#

有两点很明显,与另一个答案中的观点一样:

  • 在使用子查询时,它们完全等效:
SELECT * FROM table
WHERE column IN(subquery);

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

另一方面:

  • 只有IN运算符允许简单列表:
SELECT * FROM table
WHERE column IN(… , … , …);

假设它们是完全相同的,这让我好几次忘记了ANY不适用于列表。

zbq4xfa0

zbq4xfa03#

'in'是syntaxissugar,您可以查看计划分析,并将看到"in '“将转换为=ANY('...,...')::yourType[]

相关问题