IN
ANY
(严格来说,IN和ANY是Postgres的“构造”。或者“语法元素”,而不是“操作符”。)
逻辑上<强> < / >强 引用手册:
IN等价于= ANY。
= ANY
但是有两个IN的<强>语法变异< / >强和两个ANY的变体。细节:
IN 取set等价于= ANY取集,如下所示:
但两者的第二种变体略有不同。ANY构造的第二个变体接受数组(必须是实际的数组类型),而IN的第二个变体接受逗号分隔的值列表。这导致了传递值的不同限制,并且可以在特殊情况下也导致了不同的查询计划:
=any()
in
ANY构造更加通用,因为它可以与各种操作符组合,而不仅仅是=。例子:
=
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
对于大量的值,为每个值提供集可以更好地扩展:
相关:
查找id在给定数组中的行;
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构造函数),您可能需要显式强制转换
带有id IS NULL的行不会传递这两个表达式中的任何一个。要额外包含NULL值:
id IS NULL
NULL
SELECT * FROM tbl WHERE (id = ANY ('{1, 2}')) IS NOT TRUE;
这里有两个明显的观点,和另一个答案中的观点一样:
SELECT * FROM table WHERE column IN(subquery); SELECT * FROM table WHERE column = ANY(subquery);
On the other hand:
Only the IN operator allows a simple list:
SELECT * FROM table WHERE column IN(… , … , …);
Presuming they are exactly the same has caught me out several times when forgetting that ANY doesn’t work with lists.