IN (Transact-SQL)

指定された値が、サブクエリまたは一覧内の値と一致するかどうかを判断します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • test_expression
    任意の有効なです。

  • subquery
    1 列の結果セットを返すサブクエリです。この列のデータ型は、test_expression のデータ型と同じである必要があります。

  • expression[ ,... n ]
    一致するかどうかのテストに使用する式のリストです。すべての式は、test_expression と同じ型である必要があります。

戻り値の型

Boolean

戻り値

test_expression の値が subquery によって返される値と等しい場合、またはコンマ区切りの一覧内の expression と等しい場合、戻り値は TRUE になり、そうでない場合は FALSE になります。

NOT IN を使用すると、subquery の値または expression は否定されます。

注記注意

IN または NOT IN を使用して test_expression と比較される subquery または expression で NULL 値が返された場合は、すべて UNKNOWN が返されます。IN または NOT IN と共に NULL 値を使用すると、予期しない結果が生じる可能性があります。

説明

IN 句に極端に多く (何千も) の値を含めると、リソースが消費されてエラー 8623 または 8632 が返される場合があります。この問題を回避するには、項目をテーブルの IN リストに格納します。

エラー 8623:

クエリ プロセッサの内部リソースの不足により、クエリ プランを作成できません。これはまれなイベントで、非常に複雑なクエリ、または非常に多数のテーブルまたはパーティションを参照するクエリに限り発生します。クエリを簡単にしてください。このメッセージがエラーにより表示されたと考えられる場合、詳細についてはご購入元に問い合わせてください。

エラー 8632:

内部エラー: Expression Service の制限に達しました。クエリを確認し、複雑な式がある場合は簡素化してください。

A. OR と IN を比較する

次の例では、デザイン エンジニア、ツール デザイナー、またはマーケティング アシスタントのいずれかである従業員の名前の一覧を選択します。

USE AdventureWorks2008R2;
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

IN を使用しても同じ結果が得られます。

USE AdventureWorks2008R2;
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

以下に各クエリの結果セットを示します。

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 とサブクエリを使用する

次の例では、年間の販売ノルマが 250,000 ドルを超えるすべての販売員の ID が SalesPerson テーブルから検索され、次に、Employee テーブルから、SELECT サブクエリの結果に一致する EmployeeID の従業員の名前がすべて選択されます。

USE AdventureWorks2008R2;
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 AdventureWorks2008R2
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