IN (Transact-SQL)
Determina se um valor especificado corresponde a qualquer valor em uma subconsulta ou uma lista.
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.
Cuidado |
---|
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 AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title = 'Design Engineer'
OR e.Title = 'Tool Designer'
OR e.Title = 'Marketing Assistant';
GO
Entretanto, você recupera os mesmos resultados usando IN.
USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.Title 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 AdventureWorks;
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000);
GO
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 AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
JOIN HumanResources.Employee AS e
ON e.ContactID = c.ContactID
WHERE EmployeeID NOT IN
(SELECT SalesPersonID
FROM Sales.SalesPerson
WHERE SalesQuota > 250000)
GO
Consulte também