- 29.08.2016
- 4 Minuten zu lesen
-
- c
- j
- r
- M
- i
-
+5
Gilt für: SQL Server (alle unterstützten Versionen) Azure SQL Datenbank Azure SQL Managed Instance Azure Synapse Analytics Parallel Data Warehouse
Ermittelt, ob ein angegebener Wert mit einem beliebigen Wert in einer Subquery oder einer Liste übereinstimmt.
Transact-SQL-Syntaxkonventionen
Syntax
test_expression IN ( subquery | expression )
Hinweis
Um die Transact-SQL-Syntax für SQL Server 2014 und früher zu sehen, lesen Sie die Dokumentation zu früheren Versionen.
Argumente
test_expression
Ist ein beliebiger gültiger Ausdruck.
subquery
Ist eine Subquery, die eine Ergebnismenge von einer Spalte hat. Diese Spalte muss den gleichen Datentyp wie test_expression haben.
expression
Ist eine Liste von Ausdrücken, die auf eine Übereinstimmung getestet werden sollen. Alle Ausdrücke müssen vom gleichen Typ wie test_expression sein.
Ergebnistypen
Boolean
Ergebniswert
Wenn der Wert von test_expression gleich einem von subquery zurückgegebenen Wert oder gleich einem Ausdruck aus der kommagetrennten Liste ist, ist der Ergebniswert TRUE; andernfalls ist der Ergebniswert FALSE.
Die Verwendung von NOT IN negiert den Wert der Unterabfrage oder des Ausdrucks.
Achtung
Alle von der Unterabfrage oder dem Ausdruck zurückgegebenen Nullwerte, die mit IN oder NOT IN mit test_expression verglichen werden, geben UNKNOWN zurück. Die Verwendung von Null-Werten in Verbindung mit IN oder NOT IN kann zu unerwarteten Ergebnissen führen.
Bemerkungen
Eine extrem große Anzahl von Werten (viele Tausend durch Kommas getrennte Werte) innerhalb der Klammern in einer IN-Klausel einzuschließen, kann Ressourcen verbrauchen und Fehler 8623 oder 8632 zurückgeben. Um dieses Problem zu umgehen, speichern Sie die Elemente der IN-Liste in einer Tabelle und verwenden Sie eine SELECT-Subquery innerhalb einer IN-Klausel.
Fehler 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.
Fehler 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
Beispiele
A. Vergleich von OR und IN
Das folgende Beispiel selektiert eine Liste mit den Namen von Mitarbeitern, die Konstrukteure, Werkzeugkonstrukteure oder Marketingassistenten sind.
-- 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
Sie erhalten jedoch die gleichen Ergebnisse, wenn Sie IN verwenden.
-- 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 ist die Ergebnismenge aus beiden Abfragen.
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. Verwendung von IN mit einer Unterabfrage
Das folgende Beispiel findet alle IDs für die Verkäufer in der Tabelle SalesPerson
für Mitarbeiter, die eine Verkaufsquote von mehr als 250.000 $ für das Jahr haben, und wählt dann aus der Tabelle Employee
die Namen aller Mitarbeiter aus, bei denen EmployeeID
die Ergebnisse aus der Unterabfrage SELECT
übereinstimmen.
-- 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 ist die Ergebnismenge.
FirstName LastName --------- -------- Tsvi Reiter Michael Blythe Tete Mensa-Annan (3 row(s) affected)
C. Verwendung von NOT IN mit einer Subquery
Das folgende Beispiel findet die Verkäufer, deren Quote nicht größer als 250.000 $ ist. NOT IN
findet die Verkäufer, die nicht mit den Elementen in der Werteliste übereinstimmen.
-- 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
Beispiele: Azure Synapse Analytics und Parallel Data Warehouse
D. Verwenden von IN und NOT IN
Das folgende Beispiel findet alle Einträge in der Tabelle FactInternetSales
, die mit SalesReasonKey
Werten in der Tabelle DimSalesReason
übereinstimmen.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey IN (SELECT SalesReasonKey FROM DimSalesReason);
Das folgende Beispiel findet alle Einträge in der Tabelle FactInternetSalesReason
, die nicht mit SalesReasonKey
-Werten in der Tabelle DimSalesReason
übereinstimmen.
-- Uses AdventureWorks SELECT * FROM FactInternetSalesReason WHERE SalesReasonKey NOT IN (SELECT SalesReasonKey FROM DimSalesReason);
E. Verwenden von IN mit einer Ausdrucksliste
Das folgende Beispiel findet alle IDs für die Verkäufer in der Tabelle DimEmployee
für Mitarbeiter, deren Vorname entweder Mike
oder Michael
ist.
-- Uses AdventureWorks SELECT FirstName, LastName FROM DimEmployee WHERE FirstName IN ('Mike', 'Michael');
Siehe auch
CASE (Transact-SQL)
Ausdrücke (Transact-SQL)
Built-in-Funktionen (Transact-SQL)
Operatoren (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)
ALL (Transact-SQL)
SOME | ANY (Transact-SQL)