sql - IN 与 PostgreSQL 中的 ANY 运算符

标签 sql postgresql sql-in

PostgreSQL 中INANY 运算符有什么区别?
两者的工作机制似乎是一样的。谁能举例说明一下?

最佳答案

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

逻辑上quoting the manual :

IN is equivalent to = ANY.

但是 IN 有两个语法变体ANY 有两个变体。详情:

IN 取一个集合等同于= ANY取一个集合 ,如此处所示:

但每个的第二个变体略有不同。 ANY 构造的第二个变体接受一个数组(必须是一个实际的数组类型),而 IN 的第二个变体接受一个逗号-分隔的值列表。这会导致传递值的不同限制,并且可能在特殊情况下还会导致不同的查询计划:

ANY 更通用

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

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

对于大量的值,提供一个集合可以更好地适应每个值:

相关:

反转/相反/排除

“查找 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 constructor , 另外两个是 array literal . 无类型数组字面量的类型派生自左侧的(已知)元素类型。
在其他情况下(类型化数组值/您想要一个不同的类型/非默认类型的 ARRAY 构造函数)您可能需要显式转换。

带有 id IS NULL 的行不通过这些表达式中的任何一个。要额外包含 NULL 值:

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

关于sql - IN 与 PostgreSQL 中的 ANY 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627026/

相关文章:

postgresql - 加入postgresql

带有 IN 子句和 LIMIT 的 PHP PDO

sql - ORDER BY IN 值列表

postgresql-13-postgis-3 : Depends: libgdal20 (>= 2. 0.1) 但它不会被安装

ruby-on-rails - 请安装 postgresql 适配器 : `gem install activerecord-postgresql-adapter`

sql - 将分隔字符串分解为临时表

SQL 语法问题

php - 如何从数组输出中删除垃圾数据

sql - 如何让 EF 使用实体作为导入存储过程的参数?