Compartilhar via


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 de 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 obter 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, (a subconsulta) scalar_expression = ALL seria avaliada como FALSE, porque alguns dos valores da subconsulta (o valor 3) não atenderiam 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 AdventureWorks2008R2 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.

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

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 atende aos critérios. A segunda consulta não.

EXECUTE ManyDaysToComplete 49080, 2 ;

Aqui está o conjunto de resultados.

Todos os itens desse pedido podem ser fabricados no número de dias especificado ou em menos dias.

EXECUTE ManyDaysToComplete 49080, 1 ;

Aqui está o conjunto de resultados.

Pelo menos um item desse pedido não pode ser fabricado no número de dias especificado.