Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-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)