Являются ли SQL ANY и SOME синонимами во всех диалектах SQL?
В 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
- Н2
- 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
Несколько строк после того, что вы цитируете, стандарт 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>
, независимо от того, является ли он альтернативой SOME или ANY, поэтому да, они являются синонимами в соответствии со стандартным