Partilhar via


EM (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Determina se um valor especificado corresponde a qualquer valor em uma subconsulta ou lista.

Transact-SQL convenções de sintaxe

Syntax

test_expression [ NOT ] IN   
    ( subquery | expression [ ,...n ]  
    )   

Arguments

test_expression
É qualquer expressão válida.

subquery
É uma subconsulta que tem um conjunto de resultados de uma coluna. Esta coluna deve ter o mesmo tipo de dados que test_expression.

expressão[ ,... n ]
É uma lista de expressões para testar uma correspondência. Todas as expressões devem ser do mesmo tipo que test_expression.

Tipos de Resultados

Boolean

Valor do Resultado

Se o valor de test_expression for igual a qualquer valor retornado pela subconsulta ou for igual a qualquer expressão da lista separada por vírgula, o valor do resultado será TRUE; caso contrário, o valor do resultado será FALSE.

O uso de NOT IN nega o valor ou a expressão da subconsulta.

Caution

Quaisquer valores nulos retornados por subconsulta ou expressão que são comparados a test_expression usando IN ou NOT IN retornam UNKNOWN. Usar valores nulos em conjunto com IN ou NOT IN pode produzir resultados inesperados.

Remarks

Incluindo explicitamente um número extremamente grande de valores (muitos milhares de valores separados por vírgulas) entre parênteses, em uma cláusula IN pode consumir recursos e retornar erros 8623 ou 8632. Para contornar 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.

Examples

A. Comparando OR e IN

O exemplo a seguir seleciona uma lista dos nomes dos 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  

No entanto, 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 de qualquer consulta.

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 localiza todas as IDs dos vendedores na tabela para funcionários que têm uma cota de vendas maior que US$ 250.000 para o ano e, em SalesPerson seguida, seleciona na tabela os Employee nomes de todos os funcionários em EmployeeID que correspondem aos resultados da SELECT subconsulta.

-- 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  

Aqui está 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 na 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 and Analytics Platform System (PDW)

D. Usando IN e NOT IN

O exemplo a seguir localiza todas as entradas na tabela que correspondem FactInternetSales aos SalesReasonKey valores na DimSalesReason tabela.

-- Uses AdventureWorks  
  
SELECT * FROM FactInternetSalesReason   
WHERE SalesReasonKey   
IN (SELECT SalesReasonKey FROM DimSalesReason);   

O exemplo a seguir localiza todas as entradas na FactInternetSalesReason tabela que não correspondem SalesReasonKey aos valores na DimSalesReason tabela.

-- 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 DimEmployee seguir localiza todas as IDs dos vendedores na tabela para funcionários que têm um nome próprio que é ou MikeMichael.

-- Uses AdventureWorks  
  
SELECT FirstName, LastName  
FROM DimEmployee  
WHERE FirstName IN ('Mike', 'Michael');  

Ver também

CASO (Transact-SQL)
Expressões (Transact-SQL)
Funções incorporadas (Transact-SQL)
Operadores (Transact-SQL)
SELECIONAR (Transact-SQL)
ONDE (Transact-SQL)
TODOS (Transact-SQL)
ALGUNS | QUALQUER (Transact-SQL)