作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
PostgreSQL 中IN
和ANY
运算符有什么区别?
两者的工作机制似乎是一样的。谁能举例说明一下?
最佳答案
(严格来说,IN
和ANY
是 Postgres 的“构造”或“语法元素”,而不是“运算符”。)
逻辑上,quoting the manual :
IN
is equivalent to= ANY
.
但是 IN
有两个语法变体,ANY
有两个变体。详情:
IN
取一个集合等同于= ANY
取一个集合 ,如此处所示:
但每个的第二个变体略有不同。 ANY
构造的第二个变体接受一个数组(必须是一个实际的数组类型),而 IN
的第二个变体接受一个逗号-分隔的值列表。这会导致传递值的不同限制,并且可能在特殊情况下还会导致不同的查询计划:
=any()
but used with 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/
我是一名优秀的程序员,十分优秀!