Являются ли SQL ЛЮБОЙ и НЕКОТОРЫЕ ключевые слова синонимами на всех диалектах SQL? - PullRequest
11 голосов
/ 07 января 2012

В 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:

  • DB2
  • Derby
  • H2
  • HSQLDB
  • Энгр
  • MySQL
  • Oracle
  • Postgres
  • SQL Server
  • Sybase ASE
  • Sybase SQL Anywhere

Могу ли я с уверенностью предположить, что все эти диалекты (и другие тоже) трактуют ANY и SOME как синонимы или есть тонкая разница между двумя ключевыми словами в любой / некоторых СУБД?

Я нашел это в определении SQL92:

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

Это ничего не говорит о семантике ANY и SOME. Далее в документе упоминается только <some>, а не два ключевых слова. Я подозреваю, что может быть небольшая разница в обработке NULL, например, по крайней мере, в некоторых СУБД. Любой / некоторый указатель на четкое утверждение, можно ли это предположить или нет, приветствуется.

1 Ответ

5 голосов
/ 07 января 2012

Через несколько строк после того, что вы цитируете, стандарт SQL92 также определяет семантику для <some>, а именно:

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.

Эти правила применяются к токену <some>, независимо от того, является ли онНЕКОТОРЫЕ или ЛЮБЫЕ альтернативы, так что да, они являются синонимами согласно стандарту

...