PostgreSQL中的IN运算符和ANY运算符
PostgreSQL中的IN运算符和ANY运算符
在PostgreSQL中,IN
运算符和ANY
运算符有什么区别?
两种运算符的工作机制似乎是一样的。有人可以举个例子来解释一下吗?
admin 更改状态以发布 2023年5月20日
严格地说,IN
和ANY
是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;