Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base 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)