- 08/29/2016
- 4 minuten om te lezen
-
- c
- j
- r
- M
- i
-
+5
eldt voor:SQL Server (alle ondersteunde versies)Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsParallel Data Warehouse
Bepaalt of een opgegeven waarde overeenkomt met een willekeurige waarde in een subquery of een lijst.
Transact-SQL Syntax Conventions
Syntax
test_expression IN ( subquery | expression )
Note
Om de Transact-SQL syntax voor SQL Server 2014 en eerder te bekijken, zie documentatie over eerdere versies.
Argumenten
test_expression
Is elke geldige expressie.
subquery
Is een subquery die een result set van één kolom heeft. Deze kolom moet hetzelfde gegevenstype hebben als test_expression.
expression
Is een lijst van expressies om te testen op een overeenkomst. Alle expressies moeten van hetzelfde type zijn als test_expression.
Resulttypen
Boolean
Resultwaarde
Als de waarde van test_expression gelijk is aan een waarde die door subquery wordt geretourneerd of gelijk is aan een expressie uit de door komma’s gescheiden lijst, is de resultaatwaarde TRUE; anders is de resultaatwaarde FALSE.
Het gebruik van NOT IN ontkent de waarde van de subquery of de expressie.
Voorzichtigheid
Alle null-waarden die door een subquery of expressie worden geretourneerd en die met behulp van IN of NOT IN met test_expression worden vergeleken, leveren UNKNOWN op. Het gebruik van null-waarden in combinatie met IN of NOT IN kan onverwachte resultaten opleveren.
Opmerkingen
Het expliciet opnemen van een extreem groot aantal waarden (vele duizenden waarden gescheiden door komma’s) binnen de haakjes, in een IN-clausule kan resources opslokken en fouten 8623 of 8632 teruggeven. Om dit probleem te omzeilen, slaat u de items in de IN-lijst op in een tabel, en gebruikt u een SELECT subquery binnen een IN-clausule.
Fout 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.
Fout 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Voorbeelden
A. OR en IN vergelijken
Het volgende voorbeeld selecteert een lijst met de namen van werknemers die ontwerpingenieurs, werktuigontwerpers 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
Hoewel u dezelfde resultaten verkrijgt door IN te gebruiken.
-- 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 is de resultatenverzameling 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
Het volgende voorbeeld vindt alle ID’s voor de verkopers in de tabel SalesPerson
voor werknemers die een verkoopquotum hebben dat groter is dan $250.000 voor het jaar, en selecteert vervolgens uit de Employee
tabel de namen van alle werknemers waar EmployeeID
die overeenkomen met de resultaten uit 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 de resultatenset.
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
C. NOT IN gebruiken met een subquery
Het volgende voorbeeld vindt de verkopers die geen quotum groter dan $250.000 hebben. NOT IN
vindt de verkopers die niet overeenkomen met de items in de waardenlijst.
-- 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 en Parallel Data Warehouse
D. IN en NIET IN gebruiken
Het volgende voorbeeld vindt alle entries in de FactInternetSales
tabel die overeenkomen met SalesReasonKey
waarden in de DimSalesReason
tabel.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey IN (SELECT SalesReasonKey FROM DimSalesReason);
Het volgende voorbeeld vindt alle items in de FactInternetSalesReason
tabel 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
Het volgende voorbeeld vindt alle ID’s voor de verkopers in de tabel DimEmployee
voor werknemers die een voornaam hebben die Mike
of Michael
is.
-- Uses AdventureWorks SELECT FirstName, LastName FROM DimEmployee WHERE FirstName IN ('Mike', 'Michael');
Zie ook
CASE (Transact-SQL)
Expressies (Transact-SQL)
Built-in Functies (Transact-SQL)
Operators (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)