SOME | ANY (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Compara um valor escalar com um conjunto de valores de uma única coluna. SOME e ANY são equivalentes.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

scalar_expression
É qualquer expressão válida.

{ = | <> | != | > | >= | !> | < | <= | !< }
É qualquer operador de comparação válido.

SOME | ANY

Especifica que uma comparação deve ser feita.

subquery

É uma subconsulta que tem um conjunto de resultados de uma coluna. O tipo de dados da coluna retornada deve ser o mesmo da scalar_expression.

Tipos de resultado

Booliano

Valor do resultado

SOME ou ANY retornará TRUE quando a comparação especificada for TRUE para todos os pares (scalar_expression, x) e quando x for um valor no conjunto de uma única coluna, caso contrário retornará FALSE.

Comentários

SOME exige que a scalar_expression seja comparada positivamente com, pelo menos, um valor retornado pela subconsulta. Para obter instruções que exigem que scalar_expression seja comparada positivamente com todo valor retornado pela subconsulta, confira ALL (Transact-SQL). Por exemplo, se a subconsulta retornar os valores 2 e 3, scalar_expression = SOME (subconsulta) será avaliada como TRUE para um scalar_express igual a 2. Se a consulta aninhada retornar os valores 2 e 3, scalar_expression = ALL (consulta aninhada) será avaliada como FALSE, porque alguns dos valores da consulta aninhada (o valor 3) não atenderão aos critérios da expressão.

Exemplos

a. Executando um exemplo simples

As instruções a seguir criam uma tabela simples e adicionam os valores 1, 2, 3 e 4 à coluna ID.

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

A consulta a seguir retorna TRUE porque 3 é menor do que alguns dos valores da tabela.

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

A consulta a seguir retorna FALSE porque 3 não é menor do que todos os valores da tabela.

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

B. Executando um exemplo prático

O exemplo a seguir cria um procedimento armazenado que determina se todos os componentes de um SalesOrderID especificado no banco de dados AdventureWorks2022 podem ser fabricados no número de dias especificado. O exemplo usa uma subconsulta para criar uma lista do número do valor de DaysToManufacture para todos os componentes do SalesOrderID específico e, em seguida, testa se algum dos valores retornados pela subconsulta é maior que o número de dias especificado. Se todo valor de DaysToManufacture retornado for menor que o número fornecido, a condição será TRUE e a primeira mensagem será impressa.

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

Para testar o procedimento, execute-o usando o SalesOrderID``49080, que tem um componente que exige 2 dias e dois componentes que exigem 0 dia. A primeira instrução atende aos critérios. A segunda consulta não.

EXECUTE ManyDaysToComplete 49080, 2 ;  

Veja a seguir o conjunto de resultados.

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

EXECUTE ManyDaysToComplete 49080, 1 ;  

Veja a seguir o conjunto de resultados.

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

Confira também