【发布时间】:2012-02-04 23:52:27
【问题描述】:
在 Postgres 中,ANY 和 SOME 在谓词表达式的右侧使用时是同义词。例如,这些是相同的:
column = ANY (SELECT ...)
column = SOME (SELECT ...)
这在此处记录:
http://www.postgresql.org/docs/9.1/static/functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME
我观察到 ANY 和 SOME 至少受到以下 SQL DBMS 的支持:
- DB2
- 德比
- H2
- HSQLDB
- 安格尔
- MySQL
- 甲骨文
- Postgres
- SQL 服务器
- Sybase ASE
- Sybase SQL Anywhere
我可以安全地假设所有这些方言(以及其他方言)都将ANY 和SOME 视为同义词,或者在任何/某些 DBMS 中这两个关键字之间是否存在细微差别?
我在 SQL92 定义中找到了这个:
<quantifier> ::= <all> | <some>
<all> ::= ALL
<some> ::= SOME | ANY
这并没有说明ANY 和SOME 的语义。稍后在文档中,仅引用了<some>,而不是这两个关键字。我怀疑NULL 处理可能存在细微差别,例如,至少在某些 DBMS 中。欢迎任何/一些指向明确声明是否可以假设的指针。
【问题讨论】:
-
+1 在这个 SO 问题之前,我什至不知道 SOME/ANY。每天学些新东西! :-)
-
@klabranche:是的,它允许非常优雅的子查询! Postgres 甚至接受ANY(array), SOME(array), ALL(array) 语法
-
绝对可以放入工具带中。
-
@LukasEder - 我从来没有发现这些的用途。例如,
WHERE X > ANY(SELECT foo ...)可以很容易地重写为WHERE X > (SELECT MIN(foo) ...),而在 SQL Server 中,第二个更有效。 -
@Martin Smith:某些带有量词的条件可能看起来比它们可能的替代品更清晰。例如,
X <> SOME (SELECT Y FROM T)在我看来肯定比EXISTS (SELECT * FROM T WHERE Y <> Z)更清晰。不过我承认我自己从来没有使用过量词,除了有时在练习中。
标签: sql subquery any sql-standards