CONTAINSTABLE (Transact-SQL)

単語または語句の完全一致検索やあいまい検索、特定の範囲内で近くにある単語の検索、および重み付き検索を行う場合、文字ベースのデータ型を含む列に対して、0 行以上の行を含むテーブルを返します。CONTAINSTABLE は、標準のテーブル名のように、SELECT ステートメントの FROM 句でのみ参照できます。

CONTAINSTABLE を使用するクエリでは、制約型のフルテキスト クエリを指定して、各行の関連順位値 (RANK) とフルテキスト キー (KEY) を取得します。CONTAINSTABLE 関数では、CONTAINS 述語と同じ検索条件を使用します。

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

構文

CONTAINSTABLE ( table , { column_name | (column_list ) | * } , ' < contains_search_condition > ' 
     [ , LANGUAGE language_term] 
  [ , top_n_by_rank ] 
          ) 
< contains_search_condition > ::= 
    { < simple_term > 
    | < prefix_term > 
    | < generation_term > 
    | < proximity_term > 
    |  < weighted_term > 
    } 
    | { ( < contains_search_condition > ) 
    { { AND | & } | { AND NOT | &! } | { OR | | } } 
     < contains_search_condition > [ ...n ] 
    }
< simple_term > ::= 
          word | " phrase "
< prefix term > ::= 
     { "word * " | "phrase *" } 
< generation_term > ::= 
     FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] ) 
< proximity_term > ::= 
     { < simple_term > | < prefix_term > } 
     { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ] 
< weighted_term > ::= 
     ISABOUT
        ( { { 
  < simple_term > 
  | < prefix_term > 
  | < generation_term > 
  | < proximity_term > 
  } 
   [ WEIGHT ( weight_value ) ] 
   } [ ,...n ] 
        )

引数

  • table
    フルテキスト インデックスが作成されているテーブルの名前を指定します。table には、1 ~ 4 つの要素で構成されるデータベース オブジェクト名を指定できます。ビューに対してクエリを実行する場合は、フルテキスト インデックスが作成されたベース テーブルを 1 つだけ指定できます。

    table にサーバー名は指定できません。また、リンク サーバーに対するクエリでは使用できません。

  • column_name
    フルテキスト検索用にインデックスが作成される 1 つ以上の列の名前を指定します。データ型が char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary、または varbinary(max) の列を指定できます。

  • column_list
    コンマ区切りで複数の列を指定できます。column_list はかっこで囲む必要があります。language_term を指定しない場合、column_list で指定するすべての列の言語は同じにする必要があります。

  • *
    table のフルテキスト インデックスを持つすべての列が、指定された検索条件の検索で使用されるように指定します。language_term を指定しない場合、テーブルのすべての列の言語は同じであることが必要です。

  • LANGUAGE language_term
    クエリにおいて、単語区切り、語幹検索、類義語のチェック、およびノイズ語 (ストップ ワード) の破棄を行うときに使用する言語リソースの言語を指定します。このパラメータは省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。language_term を指定した場合、その言語は検索条件のすべての要素に適用されます。値を指定しなかった場合は、列のフルテキストの言語が使用されます。

    1 つの列に言語の異なる複数のドキュメントが BLOB (Binary Large Object) として格納されている場合、そのインデックスの作成に使用される言語は、そのドキュメントのロケール識別子 (LCID) によって決まります。そのような列に対してクエリを実行する場合は、LANGUAGElanguage_term を指定すると検索の一致率が高まります。

    language_term を文字列として指定する場合は、sys.syslanguages 互換性ビューの "別名" 列の値に対応します。文字列の場合は、'language_term' のように引用符 (') で囲む必要があります。language_term を整数で指定する場合は、その言語を表す実際の LCID を指定します。language_term を 16 進数の値で指定する場合は、「0x」の後に LCID の 16 進数の値を指定します。16 進数の値は、先頭の 0 を含め、8 桁以内で指定してください。

    値を 2 バイト文字セット (DBCS) の形式で指定すると、Microsoft SQL Server で Unicode に変換されます。

    指定した言語が無効であるか、その言語に該当するリソースがインストールされていない場合は、エラーが返されます。ニュートラル言語リソースを使用するには、language_term に「0x0」を指定してください。

  • top_n_by_rank
    一致したものの中から、降順で順位の高い方から n 個だけを取得します。これは、整数値 n を指定した場合のみ適用されます。top_n_by_rank を他のパラメータと組み合わせた場合、クエリから返される行数は、実際にすべての述語に一致する行数より少なくなります。top_n_by_rank では、最も関連性の高いヒットだけを再度呼び出すことでクエリのパフォーマンスを向上させることができます。

  • <contains_search_condition>
    column_name で検索するテキストと、その一致条件を指定します。検索条件の詳細については、「CONTAINS (Transact-SQL)」を参照してください。

説明

フルテキストの述語と関数の対象は、FROM 述語で示される 1 つのテーブルです。複数のテーブルを検索するには、FROM 句で結合テーブルを使用して、複数のテーブルが組み合わされた結果セットを検索します。

返されるテーブルには、フルテキスト キー値を含む KEY という列があります。フルテキスト インデックス作成対象の各テーブルには、値が一意になっていることが保証される列があります。KEY 列に返される値は、制約検索条件で指定された選択基準に一致する行のフルテキスト キー値です。OBJECTPROPERTYEX 関数で取得できる TableFulltextKeyColumn プロパティでは、この一意なキー列の ID が提供されます。フルテキスト インデックスのフルテキスト キーに関連付けられている列の ID を取得するには、sys.fulltext_indexes を使用します。詳細については、「sys.fulltext_indexes (Transact-SQL)」を参照してください。

元のテーブルから目的の行を取得するには、CONTAINSTABLE 行との結合を指定してください。CONTAINSTABLE を使用する場合、通常は次の形式で FROM 句を SELECT ステートメントに指定します。

SELECT select_list
FROM table AS FT_TBL INNER JOIN
   CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
   ON FT_TBL.unique_key_column = KEY_TBL.[KEY]

CONTAINSTABLE で生成されるテーブルには、RANK という列があります。RANK 列の値は、選択基準と行の一致度に応じて、0 ~ 1000 の範囲の値になります。通常、順位値は SELECT ステートメント内で次のいずれかの方法で使用します。

  • ORDER BY 句で使用し、最も順位値の高い行をテーブルの最初の行に返す。

  • 選択リストで使用し、それぞれの行に割り当てられている順位値を表示する。

CONTAINSTABLE は、互換性レベルが 70 未満の場合はキーワードとして認識されません。詳細については、「sp_dbcmptlevel (Transact-SQL)」を参照してください。

権限

実行権限は、対象テーブルまたは参照されるテーブル内の列に対して SELECT 特権を持っているユーザーにだけ与えられます。

A. CONTAINSTABLE を使って順位値を返す

次の例では、breads、fish、または beers という単語を含むすべての製品名を検索します。各単語にはそれぞれ異なる重み付けが割り当てられています。この検索基準に一致し、返された行に対して、相対的な近似度合い (順位値) を表示します。また、最も順位値の高い行を最初に返します。

USE Northwind;
GO
SELECT FT_TBL.CategoryName, FT_TBL.Description, KEY_TBL.RANK
    FROM Categories AS FT_TBL 
        INNER JOIN CONTAINSTABLE(Categories, Description, 
        'ISABOUT (breads weight (.8), 
        fish weight (.4), beers weight (.2) )' ) AS KEY_TBL
            ON FT_TBL.CategoryID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

B. CONTAINSTABLE を使って指定の値を超える順位値を返す

次の例では、Description 列の sauces または candies という語の近くに "sweet and savory" という語があるすべての食品カテゴリの説明とカテゴリ名を返します。このとき、カテゴリ名が Seafood となっているすべての行を無視し、順位値が 2 以上の行だけを返します。

USE Northwind;
GO
SELECT FT_TBL.Description, FT_TBL.CategoryName, KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)'
        ) AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
    AND FT_TBL.CategoryName <> 'Seafood'
ORDER BY KEY_TBL.RANK DESC;
GO

C. CONTAINSTABLE と top_n_by_rank を使用して上位 10 個の結果を返す

次の例では、Description 列の "sauces" または "candies" という単語の近くに "sweet and savory" という語句がある行から上位 10 組の食品カテゴリの説明とカテゴリ名を返します。

USE Northwind;
SELECT FT_TBL.Description, FT_TBL.CategoryName , KEY_TBL.RANK
FROM Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)', 10)
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY]

GO

D. LANGUAGE 引数を指定する

次の例では、LANGUAGE 引数の使用法を示します。

USE Northwind;
SELECT FT_TBL.Description , FT_TBL.CategoryName , KEY_TBL.RANK
FROM dbo.Categories AS FT_TBL 
    INNER JOIN CONTAINSTABLE (dbo.Categories, Description, 
        '("sweet and savory" NEAR sauces) OR
        ("sweet and savory" NEAR candies)',LANGUAGE N'English', 10) 
        AS KEY_TBL
        ON FT_TBL.CategoryID = KEY_TBL.[KEY];
注意

LANGUAGE language_term 引数は、top_n_by_rank. を使用するときに必須ではありません。