Compartilhar via


IN (Transact-SQL)

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

Ícone de vínculo de tópicoConvenções de sintaxe 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

Boolean

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 subquery ou expression.

Observação sobre cuidadosCuidado

Qualquer valor nulo retornado por subquery ou expression que for comparado com test_expression usando IN ou NOT IN retornará UNKNOWN. Usar valores nulos junto com IN ou NOT IN pode produzir resultados inesperados.

Comentários

Inclusive um número extremamente grande de valores (muitos milhares) em uma cláusula IN pode consumir recursos e retornar os erros 8623 ou 8632. Para solucionar este problema, armazene os itens na lista de IN em uma tabela.

Erro 8623:

O processador de consultas ficou sem recursos internos e não pôde produzir um plano de consulta. Este é um evento raro e esperado apenas em consultas extremamente complexas ou que fazem referência a um número grande de tabelas ou partições. Simplifique a consulta. Se você acredita ter recebido esta mensagem por engano, contate os Serviços de Atendimento ao Cliente para obter mais informações.

Erro 8632:

Erro interno: Limite dos serviços de expressão atingido. Procure expressões complexas na consulta e tente simplificá-las.

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.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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.

USE AdventureWorks2008R2;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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.

USE AdventureWorks2008R2;
GO
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 encontra os vendedores que não têm uma cota maior que $ 250.000. NOT IN encontra os vendedores que não correspondem aos itens na lista de valores.

USE AdventureWorks2008R2
GO
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