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ópico Convenções da 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:

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.

USE AdventureWorks2012;
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 AdventureWorks2012;
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 AdventureWorks2012;
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 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.

USE AdventureWorks2012;
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

Consulte também

Referência

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)