PostgreSQL中的IN运算符和ANY运算符

26 浏览
0 Comments

PostgreSQL中的IN运算符和ANY运算符

在PostgreSQL中,IN运算符和ANY运算符有什么区别?

两种运算符的工作机制似乎是一样的。有人可以举个例子来解释一下吗?

admin 更改状态以发布 2023年5月20日
0
0 Comments

有两个明显的点,还有另一个回答中的点:

  • 当使用子查询时,它们完全等效:

    SELECT * FROM table
    WHERE column IN(subquery);
    SELECT * FROM table
    WHERE column = ANY(subquery);
    

另一方面:

  • 只有IN运算符允许一个简单列表:

    SELECT * FROM table
    WHERE column IN(… , … , …);
    

假设它们完全相同,当我忘记ANY不适用于列表时,它们多次令我遭受打击。

0
0 Comments

严格地说,INANY是Postgres中的“构造”或“语法元素”,而不是“操作符”。

从逻辑上讲,引用手册:

IN相当于=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构造函数,其他两个使用数组字面值。未类型化的数组字面值的类型由左侧(已知)元素类型派生。
在其他情况下(有类型的数组值/您需要不同类型/用于非默认类型的ARRAY构造函数),您可能需要显式转换。

具有id IS NULL的行不满足以下任意一个表达式。如果还想包含NULL值:

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

0