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


SOME | ANY (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

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

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

scalar_expression
Любое допустимое выражение 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 (subquery) для выражения scalar_express, равного 2, будет возвращаться TRUE. Если вложенный запрос возвращает значения 2 и 3, то при scalar_expression = ALL (subquery) будет возвращаться FALSE, так как некоторые значения вложенного запроса (значение 3) могут не отвечать критериям этого выражения.

Примеры

А. Выполнение простого примера

Следующие инструкции создают простую таблицу и добавляют значения 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' ;  

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

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

-- Uses AdventureWorks

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 can''t 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.' ;

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

EXECUTE ManyDaysToComplete 49080, 2 ;  

Результирующий набор:

All items for this order can be manufactured in the specified number of days or less.

EXECUTE ManyDaysToComplete 49080, 1 ;  

Результирующий набор:

At least one item for this order can't be manufactured in specified number of days.

См. также