mrg*_*mrg 83 sql database postgresql rdbms sql-in
PostgreSQL中IN
和ANY
运算符有什么区别?
两者的工作机制似乎是一样的.任何人都能用一个例子来解释这个吗
Erw*_*ter 106
从逻辑上讲,引用手册:
IN
相当于= ANY
.
但有两个语法变种的IN
和的两种变体ANY
结构.细节:
该IN ()
变种采取了一系列相当于= ANY()
服用一集,如下所示:
但是每个的第二个变体并不等同于另一个.ANY
构造的第二个变体采用数组(必须是实际的数组类型),而第二个变体IN
采用逗号分隔的值列表.这导致了不同的限制,传递价值和可能也导致在特殊情况下不同的查询计划:
该ANY
构造更加通用,因为它可以与各种操作员组合,而不仅仅是=
.示例LIKE
:
SELECT 'foo' LIKE ANY('{FOO,bar,%oo%}');
Run Code Online (Sandbox Code Playgroud)
对于大量的值,为每个值提供更好的集合:
有关:
反转:
SELECT * FROM foo WHERE id = ANY (ARRAY[1, 2]);
Run Code Online (Sandbox Code Playgroud)
"找到行,其中id
是不是数组中的" -是:
SELECT * FROM foo WHERE id <> ALL (ARRAY[1, 2]);
Run Code Online (Sandbox Code Playgroud)
这与以下相同:
SELECT * FROM foo WHERE NOT (id = ANY (ARRAY[1, 2]));
Run Code Online (Sandbox Code Playgroud)
用行id IS NULL
不通过这两种表情.要NULL
另外包含值:
SELECT * FROM foo WHERE (id = ANY (ARRAY[1, 2])) IS NOT TRUE;
Run Code Online (Sandbox Code Playgroud)
有两个明显的观点,以及另一个答案中的观点:
它们在使用子查询时完全等效:
SELECT * FROM table
WHERE column IN(subquery);
SELECT * FROM table
WHERE column = ANY(subquery);
Run Code Online (Sandbox Code Playgroud)另一方面:
只有IN
运算符允许一个简单的列表:
SELECT * FROM table
WHERE column IN(… , … , …);
Run Code Online (Sandbox Code Playgroud)当忘记这ANY
不适用于列表时,假设它们完全相同已经让我多次陷入困境。
归档时间: |
|
查看次数: |
71547 次 |
最近记录: |