Dela via


IN (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Förhandsversion av Microsoft Fabric

Avgör om ett angivet värde matchar något värde i en underfråga eller en lista.

Transact-SQL syntaxkonventioner

Syntax

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

Arguments

test_expression
Är ett giltigt uttryck.

subquery
Är en underfråga som har en resultatuppsättning med en kolumn. Den här kolumnen måste ha samma datatyp som test_expression.

expression[ ,... n ]
Är en lista över uttryck som ska testas för en matchning. Alla uttryck måste vara av samma typ som test_expression.

Result Types

Boolean

Result Value

Om värdet för test_expression är lika med alla värden som returneras av underfrågor eller är lika med alla uttryck från kommaavgränsade listan är resultatvärdet TRUE. annars är resultatvärdet FALSE.

Om du använder NOT IN negerar du underfrågans värde eller uttryck.

Caution

Alla null-värden som returneras av underfrågor eller uttryck som jämförs med test_expression med hjälp av IN eller NOT IN returnerar OKÄND. Att använda null-värden tillsammans med IN eller NOT IN kan ge oväntade resultat.

Remarks

I en IN-sats kan du använda resurser och returnera felen 8623 eller 8632, vilket uttryckligen inkluderar ett extremt stort antal värden (många tusentals värden avgränsade med kommatecken) inom parenteserna. Du kan undvika det här problemet genom att lagra objekten i IN-listan i en tabell och använda en SELECT-underfråga i en IN-sats.

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. Jämföra OR och IN

I följande exempel väljs en lista över namnen på anställda som är designtekniker, verktygsdesigners eller marknadsföringsassistenter.

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

Du hämtar dock samma resultat med hjälp av 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  

Här är resultatuppsättningen från någon av frågorna.

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. Använda IN med en underfråga

I följande exempel hittar du alla ID:n för säljarna i SalesPerson tabellen för anställda som har en försäljningskvot som är större än 250 000 USD för året och väljer Employee sedan namnen på alla anställda där EmployeeID det matchar resultatet från SELECT underfrågan i tabellen.

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

Här är resultatet.

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

C. Använda NOT IN med en underfråga

I följande exempel hittas de säljare som inte har en kvot som är större än 250 000 USD. NOT IN hittar de säljare som inte matchar objekten i värdelistan.

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

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

D. Använda IN och NOT IN

I följande exempel hittar du alla poster i FactInternetSales tabellen som matchar SalesReasonKey värden i DimSalesReason tabellen.

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

I följande exempel hittar du alla poster i FactInternetSalesReason tabellen som inte matchar SalesReasonKey värdena i DimSalesReason tabellen.

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

E. Använda IN med en uttryckslista

I följande exempel hittar du alla ID:er för säljarna i DimEmployee tabellen för anställda som har ett förnamn som är antingen Mike eller Michael.

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

See Also

CASE (Transact-SQL)
Expressions (Transact-SQL)
Inbyggda funktioner (Transact-SQL)
Operators (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
VISSA | ANY (Transact-SQL)