SOME | ANY (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Banco de Dados SQL no Microsoft Fabric
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.