IN (Transact-SQL)
Aplica-se a: SQL Server
Banco de Dados
SQL do Azure Instância Gerenciada de SQL do
Azure Azure Synapse Analytics
PDW (Analytics Platform System)
Ponto de extremidade de análise de SQL no Microsoft Fabric
Warehouse no Microsoft Fabric
Determina se um valor especificado corresponde a qualquer valor em uma subconsulta ou uma lista.
Convenções de sintaxe de Transact-SQL
Sintaxe
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
Observação
Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.
Argumentos
test_expression
É qualquer expressão válida.
subquery
É uma subconsulta que tem um conjunto de resultados de uma coluna. Essa coluna deve ter o mesmo tipo de dados que test_expression.
expression[ ,... n ]
É uma lista de expressões que testa uma correspondência. Todas as expressões devem ser do mesmo tipo que test_expression.
Tipos de resultado
Booliano
Valor do resultado
Se o valor de test_expression for igual a qualquer valor retornado por subquery ou igual a qualquer expression da lista separada por vírgula, o valor do resultado será TRUE, caso contrário, será FALSE.
O uso de NOT IN nega o valor de subquery ou expression.
Cuidado
Os valores nulos retornados por subquery ou expression que são comparados com test_expression usando IN ou NOT IN retornam UNKNOWN. Usar valores nulos junto com IN ou NOT IN pode produzir resultados inesperados.
Comentários
A inclusão explícita de um número muito grande de valores (muitos milhares de valores separados por vírgula) dentro dos parênteses, em uma cláusula IN, pode consumir recursos e retornar os erros 8623 ou 8632. Para resolver esse problema, armazene os itens na lista IN em uma tabela e use uma subconsulta SELECT dentro de uma cláusula IN.
Erro 8623:
The query processor ran out of internal resources and could not produce a query plan. This is a rare event and only expected for extremely complex queries or queries that reference a very large number of tables or partitions. Please simplify the query. If you believe you have received this message in error, contact Customer Support Services for more information.
Erro 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Exemplos
a. Comparando OR e IN
O exemplo a seguir seleciona uma lista de nomes de funcionários que são engenheiros de design, designers de ferramentas ou assistentes de marketing.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle = 'Design Engineer'
OR e.JobTitle = 'Tool Designer'
OR e.JobTitle = 'Marketing Assistant';
GO
Entretanto, você recupera os mesmos resultados usando IN.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person AS p
JOIN HumanResources.Employee AS e
ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
GO
Aqui está o conjunto de resultados das duas consultas.
FirstName LastName Title
--------- --------- ---------------------
Sharon Salavaria Design Engineer
Gail Erickson Design Engineer
Jossef Goldberg Design Engineer
Janice Galvin Tool Designer
Thierry D'Hers Tool Designer
Wanida Benshoof Marketing Assistant
Kevin Brown Marketing Assistant
Mary Dempsey Marketing Assistant
(8 row(s) affected)
B. Usando IN com uma subconsulta
O exemplo a seguir encontra todas as IDs para os vendedores na tabela SalesPerson
para funcionários com uma cota de venda maior que $ 250.000 por ano, e seleciona na tabela Employee
os nomes de todos os funcionários em que EmployeeID
corresponde aos resultados da subconsulta SELECT
.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
JOIN Sales.SalesPerson AS sp
ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
Este é o conjunto de resultados.
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C. Usando NOT IN com uma subconsulta
O exemplo a seguir localiza os vendedores que não têm uma cota maior que US$ 250.000. NOT IN
localiza os vendedores que não correspondem aos itens da lista de valores.
-- Uses AdventureWorks
SELECT p.FirstName, p.LastName
FROM Person.Person AS p
JOIN Sales.SalesPerson AS sp
ON p.BusinessEntityID = sp.BusinessEntityID
WHERE p.BusinessEntityID NOT IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
Exemplos: Azure Synapse Analytics e PDW (Analytics Platform System)
D. Usando IN e NOT IN
O exemplo a seguir localiza todas as entradas na tabela FactInternetSales
correspondentes aos valores SalesReasonKey
na tabela DimSalesReason
.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
IN (SELECT SalesReasonKey FROM DimSalesReason);
O exemplo a seguir localiza todas as entradas na tabela FactInternetSalesReason
não correspondentes aos valores SalesReasonKey
na tabela DimSalesReason
.
-- Uses AdventureWorks
SELECT * FROM FactInternetSalesReason
WHERE SalesReasonKey
NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
E. Usando IN com uma lista de expressões
O exemplo a seguir localiza todas as IDs para os vendedores na tabela DimEmployee
de funcionários que têm o nome Mike
ou Michael
.
-- Uses AdventureWorks
SELECT FirstName, LastName
FROM DimEmployee
WHERE FirstName IN ('Mike', 'Michael');
Consulte Também
CASE (Transact-SQL)
Expressões (Transact-SQL)
Funções internas (Transact-SQL)
Operadores (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)