PostgreSQL中的IN vs ANY运算符

mrg*_*mrg 83 sql database postgresql rdbms sql-in

PostgreSQL中INANY运算符有什么区别?
两者的工作机制似乎是一样的.任何人都能用一个例子来解释这个吗

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)

  • 明确说明第二个变体的结果总是相同的,这很好.我99%肯定事实上是这样,但答案似乎没有说明.这意味着`SELECT*from mytable where id in(1,2,3)`总是会产生与`SELECT*from mytable相同的行,其中id = ANY('{1,2,3}')`,即使他们可能有不同的查询计划. (3认同)
  • `ANY` **不能**与 `!=` 运算符结合使用。我不认为它有记录,但是 `select * from foo where id != ANY (ARRAY[1, 2])` 与 `select * from foo where id NOT IN (1, 2)` 不同。另一方面,“select * from foo where NOT (id = ANY (ARRAY[1, 2]))”按预期工作。 (2认同)
  • @dvtan:“(id = ...) IS NOT TRUE”有效,因为“id = ...”仅在存在实际匹配时才计算为“TRUE”。结果“FALSE”或“NULL”通过了我们的测试。请参阅:/sf/answers/1663733781/。你添加的表达测试了其他东西。这相当于“WHERE id &lt;&gt; ALL (ARRAY[1, 2]) OR id IS NULL;” (2认同)

Man*_*ngo 8

有两个明显的观点,以及另一个答案中的观点:

另一方面:

当忘记这ANY不适用于列表时,假设它们完全相同已经让我多次陷入困境。


归档时间:

查看次数:

71547 次

最近记录:

6 年,7 月 前