SOME | ANY (Transact-SQL)

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

Ícone de vínculo de tópicoConvenções de sintaxe 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 com uma coluna. O tipo de dados da coluna retornada deve ser o mesmo que o da scalar_expression.

Tipos de resultado

Boolean

Valor do resultado

SOME ou ANY retornará TRUE quando a comparação especificada for TRUE para qualquer par (scalar_expression**,**x) em que x é um valor no conjunto com uma coluna; caso contrário, retornará FALSE.

Comentários

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

Exemplos

A. Exemplo simples

As instruções a seguir criam uma tabela simples e adiciona 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. 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 AdventureWorks 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, depois, 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.

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

Para testar o procedimento, execute-o usando o SalesOrderID49080, que tem um componente que requer 2 dias e dois componentes que requerem 0 dia. A primeira instrução a seguir corresponde aos critérios. A segunda consulta não.

EXECUTE ManyDaysToComplete 49080, 2 ;

Conjunto de resultados.

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

EXECUTE ManyDaysToComplete 49080, 1 ;

Conjunto de resultados.

At least one item for this order cannot be manufactured in specified number of days.