Compartilhar via


IN (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW) Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Banco de Dados SQL 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 ]  
    )   

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  

Veja a seguir 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)