(严格来讲,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;