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;
3条答案
按热度按时间zpqajqem1#
(严格地说,
IN
和ANY
是Postgres的"构造"或"语法元素",而不是"运算符"。)逻辑上,引用手册:
IN
等于= ANY
。但是
IN
有两个***语法变体***,ANY
有两个变体。IN
取 * 集*等价于= ANY
取 * 集 *,如下所示:但是两者的第二个变体有细微的不同。
ANY
构造的第二个变体采用array(必须是实际的数组类型),而IN
的第二个变体采用逗号分隔的值列表。这导致在传递值时有不同的限制,并且在特殊情况下 * 还可以 * 导致不同的查询计划:=any()
but used within
ANY
的功能更加丰富ANY
结构的通用性要高得多,因为它可以与各种运算符组合,而不仅仅是=
。对于大量的值,提供一个 * set * 可以更好地为每个值缩放:
相关:
反转/相反/排除
id
所在的行":*反转:"查找数组中
id
为而不是的行":三个都是等价的。第一个使用ARRAY构造函数,另外两个使用数组常量。无类型数组常量的类型是从左边的(已知)元素类型派生的。
在其他配置中(类型化的数组值/您需要不同的类型/非默认类型的ARRAY构造函数),您可能需要显式强制转换。
带有**
id IS NULL
**的行不通过这两个表达式中的任何一个。要另外包括NULL
值:ljsrvy3e2#
有两点很明显,与另一个答案中的观点一样:
另一方面:
IN
运算符允许简单列表:假设它们是完全相同的,这让我好几次忘记了
ANY
不适用于列表。zbq4xfa03#
'in'
是syntaxissugar,您可以查看计划分析,并将看到"in'
“将转换为=ANY('...,...')::yourType[]