Freigeben über


IN (Transact-SQL)

Ermittelt, ob ein angegebener Wert mit einem Wert aus einer Unterabfrage oder Liste übereinstimmt.

Themenlink (Symbol) Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

  • test_expression
    Ein beliebiger gültiger Ausdruck.

  • subquery
    Ist eine Unterabfrage mit einem Resultset, das aus einer Spalte besteht. Diese Spalte muss denselben Datentyp besitzen wie test_expression.

  • expression[ ,... n ]
    Eine Liste mit Ausdrücken, die auf Übereinstimmungen geprüft werden sollen. Alle Ausdrücke müssen denselben Datentyp besitzen wie test_expression.

Ergebnistypen

Boolean

Ergebniswert

Wenn der Wert von test_expression gleich einem von subquery zurückgegebenen Wert oder einem beliebigen anderen expression-Ausdruck aus der durch Trennzeichen getrennten Liste ist, ist der Ergebniswert TRUE; andernfalls ist er FALSE.

Durch Verwenden von NOT IN wird der Wert von subquery oder expression negiert.

VorsichtshinweisVorsicht

Bei von subquery oder expression zurückgegebenen NULL-Werten, die mithilfe von IN oder NOT IN mit test_expression verglichen werden, wird UNKNOWN zurückgegeben. Werden NULL-Werte zusammen mit IN oder NOT IN verwendet, kann dies zu unerwarteten Ergebnissen führen.

Hinweise

Wenn eine IN-Klausel eine extrem hohe Anzahl von Werten (viele Tausende) enthält, können die Ressourcen überbeansprucht werden und die Fehler 8623 oder 8632 auftreten. Speichern Sie die Elemente in der IN-Liste in einer Tabelle, um dieses Problem zu umgehen.

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.Vergleichen von OR und IN

Im folgenden Beispiel wird eine Liste der Namen von Mitarbeitern ausgewählt, die Konstruktionsingenieure, Werkzeugkonstrukteure oder Marketingassistenten sind.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person 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 können jedoch dieselben Ergebnisse mithilfe von IN abrufen.

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, e.JobTitle
FROM Person.Person p
JOIN HumanResources.Employee AS e
    ON p.BusinessEntityID = e.BusinessEntityID
WHERE e.JobTitle IN ('Design Engineer', 'Tool Designer', 'Marketing Assistant');
GO

Im Folgenden wird das Resultset der beiden Abfragen aufgeführt.

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.Verwenden von IN mit einer Unterabfrage

Im folgenden Beispiel werden alle IDs der Vertriebsmitarbeiter in der SalesPerson-Tabelle der Mitarbeiter ermittelt, deren jährliche Sollvorgabe über 250.000 EUR liegt, und aus der Employee-Tabelle die Namen aller Mitarbeiter ausgewählt, bei denen EmployeeID mit den Ergebnissen der SELECT-Unterabfrage übereinstimmt.

USE AdventureWorks2012;
GO
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

Dies ist das Resultset.

FirstName   LastName                                           
---------   -------- 
Tsvi         Reiter                                            
Michael      Blythe                                            
Tete         Mensa-Annan                                       

(3 row(s) affected)

C.Verwenden von NOT IN mit einer Unterabfrage

Im folgenden Beispiel werden die Vertriebsmitarbeiter gesucht, deren Quote 250.000 $ nicht übersteigt. NOT IN sucht die Vertriebsmitarbeiter, die nicht den Elementen in der Werteliste entsprechen.

USE AdventureWorks2012;
GO
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

Siehe auch

Verweis

CASE (Transact-SQL)

Ausdrücke (Transact-SQL)

Integrierte Funktionen (Transact-SQL)

Operatoren (Transact-SQL)

SELECT (Transact-SQL)

WHERE (Transact-SQL)

ALL (Transact-SQL)

SOME | ANY (Transact-SQL)