gpt4 book ai didi

sql - IN 与 PostgreSQL 中的 ANY 运算符

转载 作者:太空狗 更新时间:2023-10-30 01:37:24 29 4
gpt4 key购买 nike

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com