【问题标题】:Are SQL ANY and SOME keywords synonyms in all SQL dialects?在所有 SQL 方言中,SQL ANY 和 SOME 关键字是同义词吗?
【发布时间】:2012-02-04 23:52:27
【问题描述】:

在 Postgres 中,ANYSOME 在谓词表达式的右侧使用时是同义词。例如,这些是相同的:

column = ANY (SELECT ...)
column = SOME (SELECT ...)

这在此处记录:

http://www.postgresql.org/docs/9.1/static/functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME

我观察到 ANYSOME 至少受到以下 SQL DBMS 的支持:

  • DB2
  • 德比
  • H2
  • HSQLDB
  • 安格尔
  • MySQL
  • 甲骨文
  • Postgres
  • SQL 服务器
  • Sybase ASE
  • Sybase SQL Anywhere

我可以安全地假设所有这些方言(以及其他方言)都将ANYSOME 视为同义词,或者在任何/某些 DBMS 中这两个关键字之间是否存在细微差别?

我在 SQL92 定义中找到了这个:

<quantifier> ::= <all> | <some>
<all> ::= ALL
<some> ::= SOME | ANY

这并没有说明ANYSOME 的语义。稍后在文档中,仅引用了&lt;some&gt;,而不是这两个关键字。我怀疑NULL 处理可能存在细微差别,例如,至少在某些 DBMS 中。欢迎任何/一些指向明确声明是否可以假设的指针。

【问题讨论】:

  • +1 在这个 SO 问题之前,我什至不知道 SOME/ANY。每天学些新东西! :-)
  • @klabranche:是的,它允许非常优雅的子查询! Postgres 甚至接受ANY(array), SOME(array), ALL(array) 语法
  • 绝对可以放入工具带中。
  • @LukasEder - 我从来没有发现这些的用途。例如,WHERE X &gt; ANY(SELECT foo ...) 可以很容易地重写为 WHERE X &gt; (SELECT MIN(foo) ...),而在 SQL Server 中,第二个更有效。
  • @Martin Smith:某些带有量词的条件可能看起来比它们可能的替代品更清晰。例如,X &lt;&gt; SOME (SELECT Y FROM T) 在我看来肯定比EXISTS (SELECT * FROM T WHERE Y &lt;&gt; Z) 更清晰。不过我承认我自己从来没有使用过量词,除了有时在练习中。

标签: sql subquery any sql-standards


【解决方案1】:

在你引用的几行之后,SQL92 标准还指定了&lt;some&gt; 的语义,即:

c) If the implied <comparison predicate> is true for at least
one row RT in T, then "R <comp op> <some> T" is true.

d) If T is empty or if the implied <comparison predicate> is
false for every row RT in T, then "R <comp op> <some> T" is
false.

e) If "R <comp op> <quantifier> T" is neither true nor false,
then it is unknown.

这些规则适用于 &lt;some&gt; 令牌,与它是 SOME 还是 ANY 替代无关,所以是的,根据标准,它们是同义词

【讨论】:

  • 看起来像,是的。正如我所说,&lt;some&gt; 被引用,而不是关键字。但这并不是说关键字总是明确地表示相同的含义。毕竟,已经观察到许多数据库每隔一段时间就会偏离标准。例如。 Postgres: "请注意,如果没有成功且至少右侧行为运算符的结果产生 null,则 ANY 构造的结果将为 null,而不是 false。这符合 SQL 的正常规则空值的布尔组合。"
  • 嗯,这应该遵循规则(e):没有谓词为真的行,同时它也不是每一行都为假 - 对于 null 的行是未知的。所以 (c) 和 (d) 都不能应用,并且 any/some 运算符的结果是未知的
  • 我猜你是对的......我 99% 倾向于你的意见。只是在等待可能有任何/其他经验的人:)
猜你喜欢
  • 2013-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多