PostgreSQL 中的 IN 与 ANY 运算符

2024-03-12

有什么区别IN and ANYPostgreSQL 中的运算符?
两者的工作机制似乎是相同的。谁能用一个例子来解释这一点?


(严格来讲,IN and ANY是 Postgres“构造”或“语法元素”,而不是“运算符”。)

从逻辑上来说, 引用手册 https://www.postgresql.org/docs/current/functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME:

IN相当于= ANY.

但有两个语法变体 of IN和两个变体ANY。细节:

  • 如何在 WHERE 子句中使用 ANY 代替 IN? https://stackoverflow.com/questions/31191507/how-to-use-any-instead-of-in-in-a-where-clause/31192557#31192557

IN 采取set相当于= ANY采取set,如下所示:

  • PostgreSQL - IN 与 ANY https://stackoverflow.com/questions/30263671/postgresql-in-vs-any/30263897#30263897

但每个版本的第二个变体都略有不同。的第二个变体ANY构造需要一个array(必须是实际的数组类型),而第二个变体IN以逗号分隔值列表。这导致传递值和传递值时存在不同的限制can特殊情况下也会导致不同的查询计划:

  • 索引不与以下一起使用=any()但与使用in https://dba.stackexchange.com/a/125500/3684
  • 将多个值集或数组传递给函数 https://stackoverflow.com/questions/34600567/pass-multiple-sets-or-arrays-of-values-to-a-function/34601242#34601242
  • 如何匹配复合类型数组中的元素? https://stackoverflow.com/questions/69590314/how-to-match-elements-in-an-array-of-composite-type/69590967

ANY更通用

The ANY构造的用途要广泛得多,因为它可以与各种运算符组合,而不仅仅是=。例子:

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

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

  • 优化具有大 IN 的 Postgres 查询 https://dba.stackexchange.com/q/91247/3684

Related:

  • PostgreSQL 可以索引数组列吗? https://stackoverflow.com/questions/4058731/can-postgresql-index-array-columns/29245753#29245753

反转/相反/排除

“查找行id在给定的数组中”:

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

反演:“查找行id is not在数组中”:

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}'));

三者皆等价。第一个与数组构造函数 https://www.postgresql.org/docs/current/sql-expressions.html#SQL-SYNTAX-ARRAY-CONSTRUCTORS,另外两个与数组字面量 https://www.postgresql.org/docs/current/arrays.html#ARRAYS-INPUT。的类型无类型数组字面量从左侧的(已知)元素类型派生。
在其他情况下(类型化数组值/您想要不同的类型/非默认类型的 ARRAY 构造函数),您可能需要显式转换。

行与id IS NULL不要通过这些表达式中的任何一个。包括NULL另外的值:

SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中的 IN 与 ANY 运算符 的相关文章

随机推荐