CONTAINSTABLE (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース

1 つの単語や語句に対する正確な一致またはあいまい (精度の低い) 一致、単語の近接性、重み付けされた一致を含む列に対して、0 行、1 行、または複数行のテーブルを返します。 CONTAINSTABLE は 、SELECT ステートメントの FROM 句で使用され、通常のテーブル名 Transact-SQL である場合と同様に参照されます。 文字ベースのデータ型を含むフルテキスト インデックス列に対してフルテキスト SQL Server 検索を実行します。

CONTAINSTABLE は、CONTAINS 述語と同じ種類の一致に役立ち 、CONTAINS と同じ検索条件を使用します。

ただし、CONTAINS とは異なり、CONTAINSTABLE を使用するクエリでは、各行の関連性ランク付け値 (RANK) とフルテキスト キー (KEY) が返されます。 SQL Server でサポートされているフルテキスト検索の形式については、「フルテキスト検索でのクエリ」を参照してください。

トピック リンク アイコン 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>   
    | <generic_proximity_term>   
    | <custom_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 ] )   
  
<generic_proximity_term> ::=   
     { <simple_term> | <prefix_term> } { { { NEAR | ~ }   
     { <simple_term> | <prefix_term> } } [ ...n ] }  
  
<custom_proximity_term> ::=   
  NEAR (   
     {  
        { <simple_term> | <prefix_term> } [ ,...n ]  
     |  
        ( { <simple_term> | <prefix_term> } [ ,...n ] )   
      [, <maximum_distance> [, <match_order> ] ]  
     }  
       )   
  
      <maximum_distance> ::= { integer | MAX }  
      <match_order> ::= { TRUE | FALSE }   
  
<weighted_term> ::=   
     ISABOUT  
    ( { {   
  <simple_term>   
  | <prefix_term>   
  | <generation_term>   
  | <proximity_term>   
  }   
   [ WEIGHT ( weight_value ) ]   
   } [ ,...n ]   
    )  
  

引数

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

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

column_name
フルテキスト検索用にインデックスが作成される 1 つ以上の列の名前を指定します。 列には、charvarcharncharnvarchartextntextimagexmlvarbinaryvarbinary(max) のいずれかの型を指定できます。

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

*
テーブル内のすべてのフルテキスト インデックス列を使用して、指定した検索条件を検索する必要を指定します。 language_term を指定しない場合、テーブルのすべての列の言語は同じである必要があります。

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

1 つの列に言語の異なる複数のドキュメントが BLOB (Binary Large Object) として格納されている場合、そのインデックスの作成に使用される言語は、そのドキュメントのロケール識別子 (LCID) によって決まります。 そのような列に対してクエリを実行する場合は、LANGUAGE**language_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 に変換されます。

指定した言語が無効であるか、その言語に該当するリソースがインストールされていない場合は、SQL Server によりエラーが返されます。 ニュートラル言語リソースを使用するには、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。 詳細については、「Transact-sys.fulltext_indexes (」を参照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 句で、テーブル内の最初の行として最もランクの高い行を返します。

  • 選択リストで、各行に割り当てられた順位値を表示します。

アクセス許可

実行アクセス許可は、テーブルまたは参照先テーブルの列に対する適切な SELECT 権限を持つユーザーだけが使用できます。

A. 簡単な例

次の例では、2 つの列の単純なテーブルを作成して設定し、3 つの郡とそのフラグの色を一覧で示します。 テーブルにフルテキスト カタログとインデックスを作成して設定する 。 その後 、CONTAINSTABLE 構文を示します。 この例では、検索値が複数回満たされた場合にランク値が大きくなる方法を示します。 最後のクエリでは、緑と黒の両方を含む部落は、クエリされた色の 1 つのみを含むイタリアよりも高いランクを持っています。

CREATE TABLE Flags (Country nvarchar(30) NOT NULL, FlagColors varchar(200));  
CREATE UNIQUE CLUSTERED INDEX FlagKey ON Flags(Country);  
INSERT Flags VALUES ('France', 'Blue and White and Red');  
INSERT Flags VALUES ('Italy', 'Green and White and Red');  
INSERT Flags VALUES ('Tanzania', 'Green and Yellow and Black and Yellow and Blue');  
SELECT * FROM Flags;  
GO  
  
CREATE FULLTEXT CATALOG TestFTCat;  
CREATE FULLTEXT INDEX ON Flags(FlagColors) KEY INDEX FlagKey ON TestFTCat;  
GO   
  
SELECT * FROM Flags;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green') ORDER BY RANK DESC;  
SELECT * FROM CONTAINSTABLE (Flags, FlagColors, 'Green or Black') ORDER BY RANK DESC;  

B. 順位値を返す

次の例では、"frame"、"wheel"、または "tire" という単語を含むすべての製品名を検索し、各単語に異なる重みを指定します。 これらの検索条件に一致する返された行ごとに、一致の相対的な近さ (ランク付け値) が表示されます。 また、最も順位値の高い行を最初に返します。

USE AdventureWorks2012;  
GO  
  
SELECT FT_TBL.Name, KEY_TBL.RANK  
    FROM Production.Product AS FT_TBL   
        INNER JOIN CONTAINSTABLE(Production.Product, Name,   
        'ISABOUT (frame WEIGHT (.8),   
        wheel WEIGHT (.4), tire WEIGHT (.2) )' ) AS KEY_TBL  
            ON FT_TBL.ProductID = KEY_TBL.[KEY]  
ORDER BY KEY_TBL.RANK DESC;  
GO  

C. 指定した値より大きいランク値を返す

適用対象: SQL Server 2012 (11.x) 以降。

次の例では、NEAR を使用して、bracket テーブルで、相互に近接する "reflector" および "Production.Document" を検索します。 また、順位値が 50 以上の行だけを返します。

USE AdventureWorks2012  
GO  
  
SELECT DocumentNode, Title, DocumentSummary  
FROM Production.Document AS DocTable   
INNER JOIN CONTAINSTABLE(Production.Document, Document,  
  'NEAR(bracket, reflector)' ) AS KEY_TBL  
  ON DocTable.DocumentNode = KEY_TBL.[KEY]  
WHERE KEY_TBL.RANK > 50  
ORDER BY KEY_TBL.RANK DESC;  
GO  

注意

フルテキスト クエリで最大距離として整数が指定されていない場合、ギャップが 100 を超える論理項を持つヒットのみを含むドキュメントは NEAR 要件を満たさなき、ランク付けは 0 になります。

D. top_n_by_rank を使用して上位 5 個の結果を返す

次の例では、Description 列内で "light" または "lightweight" という単語の近くに "aluminum" という語句を含んでいる、上位 5 種の製品の説明を返します。

USE AdventureWorks2012;  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)',  
      5  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];  
GO  

GO

E. LANGUAGE 引数を指定する

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

USE AdventureWorks2012;  
GO  
  
SELECT FT_TBL.ProductDescriptionID,  
   FT_TBL.Description,   
   KEY_TBL.RANK  
FROM Production.ProductDescription AS FT_TBL INNER JOIN  
   CONTAINSTABLE (Production.ProductDescription,  
      Description,   
      '(light NEAR aluminum) OR  
      (lightweight NEAR aluminum)',  
      LANGUAGE N'English',  
      5  
   ) AS KEY_TBL  
   ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];  
GO  

注意

LANGUAGE 引数 language_term 使用する場合は必須 top_n_by_rank。

参照

RANK を使用して検索結果を制限する
フルテキスト検索でのクエリ
フルテキスト検索クエリの作成 (Visual Database Tools)
CONTAINS (Transact-SQL)
フルテキスト検索でのクエリ
SELECT (Transact-SQL)
FROM (Transact-SQL)