IN (Transact-SQL)
判斷指定的值是否符合子查詢或清單中的任何值。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
語法
test_expression [ NOT ] IN
( subquery | expression [ ,...n ]
)
引數
test_expression
這是任何有效的運算式。subquery
這是有單一資料行結果集的子查詢。 這個資料行必須有 test_expression 的相同資料類型。expression[ ,...n ]
這是要進行相符測試的運算式清單。 所有運算式都必須是 test_expression 的相同類型。
結果類型
Boolean
結果值
如果 test_expression 值等於 subquery 所傳回的任何值,或等於清單 (以逗號分隔) 中的任何 expression,結果值就是 TRUE;否則,結果值就是 FALSE。
使用 NOT IN 會執行 subquery 值或 expression 的否定運算。
警告
subquery 或 expression 傳回的任何 Null 值,若使用 IN 或 NOT IN 與 test_expression 比較,則會傳回 UNKNOWN。將 Null 值與 IN 或 NOT IN 一起使用可能會產生非預期的結果。
備註
在 IN 子句中包括極大量的值 (數千) 可能會耗用資源,並傳回錯誤 8623 或 8632。 若要解決此問題,請將項目儲存在資料表的 IN 清單中。
錯誤 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.
錯誤 8632:
Internal error: An expression services limit has been reached. Please look for potentially complex expressions in your query, and try to simplify them.
範例
A.比較 OR 及 IN
下列範例會選取設計工程師、工具設計師或行銷助理等員工名單。
USE AdventureWorks2012;
GO
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
不過,您將利用 IN 來擷取相同的結果。
USE AdventureWorks2012;
GO
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
以下是任何一項查詢的結果集。
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 搭配子查詢
下列範例在 SalesPerson 資料表中,針對年度銷售配額超出 $250,000 之員工來尋找銷售人員的所有識別碼,之後,再從 Employee 資料表中,選取 EmployeeID 符合 SELECT 子查詢結果的所有員工姓名。
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
以下為結果集:
FirstName LastName
--------- --------
Tsvi Reiter
Michael Blythe
Tete Mensa-Annan
(3 row(s) affected)
C.使用 NOT IN 搭配子查詢
下列範例會尋找配額不超出 $250,000 的銷售人員。 NOT IN 會尋找不符合值清單項目的銷售人員。
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