Delen via


IN (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric Preview

Bepaalt of een opgegeven waarde overeenkomt met een waarde in een subquery of een lijst.

Transact-SQL syntaxis-conventies

Syntax

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

Arguments

test_expression
Is een geldige expressie.

subquery
Is een subquery met een resultatenset van één kolom. Deze kolom moet hetzelfde gegevenstype hebben als test_expression.

expression[ ,... n ]
Is een lijst met expressies die moeten worden getest op een overeenkomst. Alle expressies moeten van hetzelfde type zijn als test_expression.

Result Types

Boolean

Result Value

Als de waarde van test_expression gelijk is aan een waarde die wordt geretourneerd door subquery of gelijk is aan een expressie uit de door komma's gescheiden lijst, is de resultaatwaarde WAAR; anders is de resultaatwaarde FALSE.

Als u NOT IN gebruikt, wordt de subquerywaarde of -expressie genegeerd.

Caution

Null-waarden die worden geretourneerd door subquery of expressie die worden vergeleken met test_expression met BEHULP van IN of NOT IN return UNKNOWN. Het gebruik van null-waarden in combinatie met IN of NIET IN kan onverwachte resultaten opleveren.

Remarks

Expliciet een extreem groot aantal waarden (veel duizenden waarden gescheiden door komma's) tussen de haakjes opnemen, kan in een IN-component resources verbruiken en fouten retourneren 8623 of 8632. Als u dit probleem wilt omzeilen, slaat u de items op in de lijst IN in een tabel en gebruikt u een SELECT-subquery binnen een IN-component.

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

Error 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. OR en IN vergelijken

In het volgende voorbeeld wordt een lijst geselecteerd met de namen van werknemers die ontwerptechnici, toolontwerpers of marketingassistenten zijn.

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

U haalt echter dezelfde resultaten op met behulp van 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  

Hier volgt de resultatenset van een van beide query's.

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. IN gebruiken met een subquery

In het volgende voorbeeld vindt u alle id's voor de verkopers in de SalesPerson tabel voor werknemers met een verkoopquotum dat groter is dan $ 250.000 voor het jaar en selecteert u vervolgens in de Employee tabel de namen van alle werknemers die EmployeeID overeenkomen met de resultaten van de SELECT subquery.

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

Hier is het resultatenoverzicht.

FirstName   LastName                                             
---------   --------   
Tsvi         Reiter                                              
Michael      Blythe                                              
Tete         Mensa-Annan                                         
  
(3 row(s) affected)  

C. NOT IN gebruiken met een subquery

In het volgende voorbeeld worden de verkopers gevonden die geen quotum van meer dan $ 250.000 hebben. NOT IN zoekt de verkopers die niet overeenkomen met de items in de lijst met waarden.

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

Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)

D. IN en NIET IN gebruiken

In het volgende voorbeeld worden alle vermeldingen in de FactInternetSales tabel gevonden die overeenkomen met SalesReasonKey waarden in de DimSalesReason tabel.

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

In het volgende voorbeeld worden alle vermeldingen in de FactInternetSalesReason tabel gevonden die niet overeenkomen met SalesReasonKey waarden in de DimSalesReason tabel.

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

E. IN gebruiken met een expressielijst

In het volgende voorbeeld vindt u alle id's voor de verkopers in de DimEmployee tabel voor werknemers die een voornaam hebben die een Mike van Michaelbeide of .

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

See Also

CASE (Transact-SQL)
Expressions (Transact-SQL)
Ingebouwde functies (Transact-SQL)
Operators (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOMMIGE | ANY (Transact-SQL)