IN (Transact-SQL)

判斷指定的值是否符合子查詢或清單中的任何值。

主題連結圖示Transact-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:

查詢處理器已用完內部資源而無法產生查詢計畫。這是只有在極端複雜的查詢或者參考非常大量資料表或資料分割的查詢才會發生的稀有事件。請簡化查詢。若認為收到此訊息有誤,請連絡客戶支援服務,以取得詳細資訊。

錯誤 8632:

內部錯誤: 到達運算式服務的限制。請找出查詢中潛在的複雜運算式,並嘗試加以簡化。

範例

A. 比較 OR 或 IN

下列範例會選取設計工程師、工具設計師或行銷助理等員工名單。

USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
    JOIN Person.Contact AS c 
    ON e.ContactID = c.ContactID
WHERE e.Title = 'Design Engineer' 
   OR e.Title = 'Tool Designer' 
   OR e.Title = 'Marketing Assistant';
GO

不過,您將利用 IN 來擷取相同的結果。

USE AdventureWorks;
GO
SELECT FirstName, LastName, e.Title
FROM HumanResources.Employee AS e
    JOIN Person.Contact AS c 
    ON e.ContactID = c.ContactID
WHERE e.Title 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 AdventureWorks;
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e
    ON e.ContactID = c.ContactID
WHERE EmployeeID IN
   (SELECT SalesPersonID
   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 AdventureWorks
GO
SELECT FirstName, LastName
FROM Person.Contact AS c
    JOIN HumanResources.Employee AS e
    ON e.ContactID = c.ContactID
WHERE EmployeeID NOT IN
   (SELECT SalesPersonID
   FROM Sales.SalesPerson
   WHERE SalesQuota > 250000)
GO