Spec-Zone .ru
спецификации, руководства, описания, API

13.2.10.3. Подзапросы с ANY, IN, илиSOME

Синтаксис:

operand comparison_operator ANY (subquery)operand IN (subquery)operand comparison_operator SOME (subquery)

Где comparison_operator один из этих операторов:

=  >  <  >=  <=  <>  !=

ANY ключевое слово, которое должно следовать за оператором сравнения, означает "возврат TRUE если сравнение TRUE для ANY из значений в столбце, который возвращает подзапрос." Например:

SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);

Предположите, что есть строка в таблице t1 содержа (10). Выражение TRUE если таблица t2 содержит (21,14,7) потому что есть значение 7 в t2 это - меньше чем 10. Выражение FALSE если таблица t2 содержит (20,10), или если таблица t2 пусто. Выражение неизвестно (то есть, NULL) если таблица t2 содержит (NULL,NULL,NULL).

Когда использующийся с подзапросом, словом IN псевдоним для = ANY. Таким образом эти два оператора являются тем же самым:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

IN и = ANY не синонимы когда использующийся со списком выражения. IN может взять список выражения, но = ANY не может. См. Раздел 12.3.2, "Функции сравнения и Операторы".

NOT IN не псевдоним для <> ANY, но для <> ALL. См. Раздел 13.2.10.4, "Подзапросы с ALL".

Слово SOME псевдоним для ANY. Таким образом эти два оператора являются тем же самым:

SELECT s1 FROM t1 WHERE s1 <> ANY  (SELECT s1 FROM t2);SELECT s1 FROM t1 WHERE s1 <> SOME (SELECT s1 FROM t2);

Использование слова SOME редко, но этот пример шоу, почему это могло бы быть полезно. Большинству людей английская фраза "не равный любому b" означает, что "нет никакого b, который равен a," но это не то, что предназначается синтаксисом SQL. Синтаксис означает, что "есть некоторый b к который не равен." Используя <> SOME вместо этого помогает гарантировать, что все понимают значение истины запроса.