Поделиться через


SOME | ANY (Transact-SQL)

Сравнивает скалярное значение с набором значений из одного столбца. Ключевые слова SOME и ANY эквивалентны.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

scalar_expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
     { SOME | ANY } ( subquery ) 

Аргументы

  • scalar_expression
    Любое допустимое выражение.

  • { = | <> | != | > | >= | !> | < | <= | !< }
    Любой допустимый оператор сравнения.

  • SOME | ANY
    Указывает на необходимость сравнения.

  • subquery
    Вложенный запрос, возвращающий результирующий набор, состоящий из одного столбца. Тип данных возвращаемого столбца должен совпадать с типом данных аргумента scalar_expression.

Типы результата

Boolean

Значение результата

При использовании ключевого слово SOME или ANY значение TRUE возвращается, если указанное сравнение имеет значение TRUE для любой пары (scalar_expression**,**x), где x является одним из значений набора из одного столбца; иначе возвращается значение FALSE.

Замечания

Для ключевого слова SOME необходим аргумент scalar_expression, чтобы провести непосредственное сравнение по крайней мере одного значения, возвращенного вложенным запросом. Инструкции, которым необходим аргумент scalar_expression для сравнения каждого значения, возвращенного вложенным запросом, перечислены в разделе ALL (Transact-SQL). Например, если вложенный запрос возвращает значения 2 и 3, то при значении scalar_expression = SOME для выражения scalar_express, равного 2, будет возвращаться TRUE. Если вложенный запрос возвращает значения 2 и 3, то при scalar_expression = ALL будет возвращаться FALSE, так как некоторые значения вложенного запроса (значение 3) не отвечают критериям этого выражения.

Примеры

A. Запуск простого примера

Следующие инструкции создают простую таблицу и добавляют значения 1, 2, 3 и 4 в столбец ID.

CREATE TABLE T1
(ID int) ;
GO
INSERT T1 VALUES (1) ;
INSERT T1 VALUES (2) ;
INSERT T1 VALUES (3) ;
INSERT T1 VALUES (4) ;

Следующий запрос возвращает значение TRUE, так как 3 меньше некоторых из значений в таблице.

IF 3 < SOME (SELECT ID FROM T1)
PRINT 'TRUE' 
ELSE
PRINT 'FALSE' ;

Следующий запрос возвращает значение FALSE, так как 3 не меньше каждого из значений в таблице.

IF 3 < ALL (SELECT ID FROM T1)
PRINT 'TRUE' 
ELSE
PRINT 'FALSE' ;

Б. Выполнение практического примера

В следующем примере показано создание хранимой процедуры, определяющей, могут ли в течение заданного количества дней быть выполнены все заказы с указанным идентификатором SalesOrderID из базы данных AdventureWorks2008R2. В этом примере для создания списка количества значений DaysToManufacture для всех компонентов SalesOrderID используется вложенный запрос, а затем проводится проверка того, превышают ли все значения, возвращаемые вложенным запросом, указанное количество дней. Если каждое возвращаемое значение DaysToManufacture меньше заданного значения, то условие равно TRUE и печатается первое сообщение.

USE AdventureWorks2008R2 ;
GO

CREATE PROCEDURE ManyDaysToComplete @OrderID int, @NumberOfDays int
AS
IF 
@NumberOfDays < SOME
   (
    SELECT DaysToManufacture
    FROM Sales.SalesOrderDetail
    JOIN Production.Product 
    ON Sales.SalesOrderDetail.ProductID = Production.Product.ProductID 
    WHERE SalesOrderID = @OrderID
   )
PRINT 'At least one item for this order cannot be manufactured in specified number of days.'
ELSE 
PRINT 'All items for this order can be manufactured in the specified number of days or less.' ;

Для проверки этой процедуры выполните ее, используя SalesOrderID49080, имеющий один заказ, требующий на выполнение 2 дня, и два заказа, требующие немедленного выполнения. Первая инструкция отвечает этим критериям. Второй запрос этим критериям не отвечает.

EXECUTE ManyDaysToComplete 49080, 2 ;

Ниже приводится результирующий набор.

Все изделия для данного заказа могут быть изготовлены за указанное число дней или быстрее.

EXECUTE ManyDaysToComplete 49080, 1 ;

Ниже приводится результирующий набор.

По крайней мере одно изделие для данного заказа не может быть изготовлено за указанное число дней.