Предикат выборки

Функция

Определение условия выборки.

Спецификация
   
<​условие​>::=
ALL | {SOME | ANY}
Синтаксические правила
  1. Типы данных <​значимого выражения​> и <​запроса выборки​> должны быть совместимы.

  2. ANY является синонимом SOME.

Общие правила
  1. <​Условие​> ANY берет все записи выборки данных, возвращаемые <​запросом выборки​>, и оценивает их как верные, если хотя бы один из них удовлетворяет <​операции сравнения​>.

    SELECT Name FROM Person
     WHERE PersonID = ANY(SELECT PersonID FROM Auto);
    
    select distinct c1 from tab1, tab2 where c1<​​>c2;

    это то же самое, что

    select c1 from tab1 where c1<​​> any (select c2 from tab2);
  2. <​Условие​> ALL берет все записи выборки данных, возвращаемые <​запросом выборки​>, и оценивает их как верные, если все они удовлетворяют <​предикат сравнения​>.

    SELECT Name FROM Person
     WHERE Salary <​= ALL (SELECT Salary FROM Person);
  3. Результат <​предиката выборки​> выводится путем применения <​предиката сравнения​> к каждой записи выборки данных из <​запроса выборки​>. При этом возможны следующие ситуации:

    • если <​запрос выборки​> пуст, или <​предикат сравнения​> является истинным для каждой записи выборки данных из <​запроса выборки​>, то результат <​значимое выражение​> <​предикат сравнения​> ALL(<​запрос выборки​>) имеет значение «истина» (TRUE);

    • если <​предикат сравнения​> имеет значение «ложь» (FALSE) хотя бы для одной записи выборки данных из <​запроса выборки​>, то результат <​значимое выражение​> <​предикат сравнения​> ALL(<​запрос выборки​>) имеет значение «ложь» (FALSE);

      Получить список лиц, чья зарплата больше, чем у всех остальных:

      SELECT Name FROM Person
       WHERE Salary ​>= ALL (SELECT Salary FROM Person);
    • если <​предикат сравнения​> имеет значение «истина» (TRUE) хотя бы для одной записи выборки данных из <​запроса выборки​>, то результат <​значимое выражение​> <​предикат сравнения​> {SOME | ANY} <​запрос выборки​> имеет значение «истина» (TRUE);

      Удалить из table_1 те строки, номера которых встречаются в table_2:

      delete from table_1 where number = ANY (select some_numbers from table_2)
    • если результат <​запроса выборки​> пуст или результатом неявно заданного <​предиката сравнения​> для каждой записи выборки данных из <​запроса выборки​> является «ложь» (FALSE), то результатом <​значимое выражение​> <​предикат сравнения​> {SOME | ANY} <​запрос выборки​> будет «ложь» (FALSE);

    • если результатом <​предиката выборки​> не являются ни TRUE, ни FALSE, значение его не определено (NULL-значение).

Примечание

Кванторные предикаты c помощью отрицания легко преобразовываются один в другой: ALL к ANY и обратно. С другой стороны, нет такого запроса, сформулированного с их использованием, который нельзя было бы в равной степени хорошо, и даже лучше, сформулировать, используя EXISTS, IN-предикат и агрегатные функции, например:

select c1 from tab1 where c1<​​> all (select c2 from tab2);

эквивалентно

select c1 from tab1 where c1 not in (select c2 from tab2);

или

select c1 from tab1 where not exists (select c2 from tab2 where c1=c2);
Примеры
  1. create or replace table
      "Справочник автопроизводителей" (make char(20));
    insert into "Справочник автопроизводителей"  values('FORD');
    insert into "Справочник автопроизводителей"  values('VAZ');
    insert into "Справочник автопроизводителей"  values('FIAT');
  2. SELECT count(make)  FROM auto
     WHERE make = ANY(table "Справочник автопроизводителей" );
    |        143|
  3. SELECT count(make) FROM auto WHERE make = ANY(values ('FORD'));