CONTAINSTABLE (Transact-SQL)

更新 : 2006 年 7 月 17 日

単語または語句の完全一致検索やあいまい検索、特定の範囲内で近くにある単語の検索、および重み付き検索を行う場合、文字ベースのデータ型を含む列に対して、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 つの要素で構成されるデータベース オブジェクト名を指定できます。
  • column_name
    table にある、検索対象の列の名前を指定します。フルテキスト検索には、charvarcharncharnvarchartextntextimagexmlbinaryvarbinary のデータ型の列が対応しています。
  • column_list
    コンマ区切りで複数の列を指定できます。column_list はかっこで囲む必要があります。language_term を指定しない場合、column_list で指定するすべての列の言語は同じにする必要があります。
  • *
    これを指定すると、contains 検索条件が指定された検索では、フルテキスト検索用に登録されたテーブル内にあるすべての列が使用されます。FROM 句に複数のテーブルが指定されている場合は、テーブル名で * を限定する必要があります。language_term を指定しない場合、テーブルのすべての列の言語は同じであることが必要です。
  • LANGUAGE language_term
    CONTAINS クエリにおいて、単語区切り、語幹検索、類義語のチェック、およびノイズ語の破棄を行うときに使用する言語リソースの言語を指定します。このパラメータは省略可能で、言語のロケール識別子 (LCID) に対応する文字列、整数、または 16 進数の値を指定できます。language_term を指定した場合、その言語は検索条件のすべての要素に適用されます。値を指定しなかった場合は、列のフルテキストの言語が使用されます。

    language_term を文字列で指定する場合は、syslanguages システム テーブルの alias 列の値と同じ値を指定します。文字列の場合は、'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 を指定した場合のみ適用されます。追加のフィルタ選択を実行すると、n 個より少ない結果が返される場合があります。
  • <contains_search_condition>
    column_name で検索するテキストと、その一致条件を指定します。詳細については、「CONTAINS (Transact-SQL)」を参照してください。

解説

返されるテーブルには、フルテキスト キー値を含む 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 という単語を含むすべての製品名を検索します。各単語にはそれぞれ異なる重み付けが割り当てられています。この検索基準に一致し、返された行に対して、相対的な近似度合い (順位値) を表示します。また、最も順位値の高い行を最初に返します。

ms189760.note(ja-jp,SQL.90).gifメモ :
この例を実行するには、Northwind データベースをインストールする必要があります。Northwind データベースのインストール方法については、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。
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 以上の行だけを返します。

ms189760.note(ja-jp,SQL.90).gifメモ :
この例を実行するには、Northwind データベースをインストールする必要があります。Northwind データベースのインストール方法については、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。
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 組の食品カテゴリの説明とカテゴリ名を返します。

ms189760.note(ja-jp,SQL.90).gifメモ :
この例を実行するには、Northwind データベースをインストールする必要があります。Northwind データベースのインストール方法については、「Northwind サンプル データベースと pubs サンプル データベースのダウンロード」を参照してください。
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];

ms189760.note(ja-jp,SQL.90).gifメモ :
LANGUAGE language_term 引数は、top_n_by_rank を使用するときに必須ではありません。

参照

関連項目

CONTAINS (Transact-SQL)
行セット関数 (Transact-SQL)
SELECT (Transact-SQL)
WHERE (Transact-SQL)

その他の技術情報

フルテキスト検索を使用した SQL Server へのクエリ

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 7 月 17 日

追加内容 :
  • LANGUAGE 引数の例を追加。