Share via


CONTAINS (Transact-SQL)

更新 : 2006 年 4 月 14 日

文字ベースのデータ型を含む列を検索するための述語です。単語または語句の完全一致検索やあいまい検索、特定の範囲内で近くにある単語の検索、重み付けした検索などを実行する場合に使用されます。

SQL Server 2005 では、CONTAINS または FREETEXT フルテキスト述語で、4 つの要素から構成される名前を使ってリンク サーバーに対しクエリを実行できます。

次に CONTAINS の検索対象を示します。

  • 単語または語句。
  • 単語または語句のプレフィックス。
  • 別の単語の近くにある単語。
  • 他の単語を語形変化して生成した単語。たとえば、drive という単語からは、drives、drove、driving、driven などの単語が生成されます。
  • 別の単語のシノニムになっている単語 (類義語を使用)。たとえば、金属という単語には、アルミニウムやスチールなどのシノニムがあります。

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

構文

 CONTAINS       ( { column_name | (column_list) | * }            , '< contains_search_condition >'         [ , LANGUAGE language_term ]       )  < 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 ]          )  < AND > ::=       { AND | & } < AND NOT > ::=       { AND NOT | & !} < OR > ::=       { OR | | } 

引数

  • column_name
    フルテキスト インデックスに含める列の名前を指定します。フルテキスト検索には、charvarcharncharnvarchartextntextimagexmlvarbinary(max) のデータ型の列が対応しています。
  • column_list
    コンマ区切りで複数の列を指定できます。column_list はかっこで囲む必要があります。language_term を指定しない場合、column_list で指定するすべての列の言語は同じにする必要があります。
  • *
    これを指定すると、contains 検索条件が指定された検索では、フルテキスト検索用に登録されたテーブル内にあるすべての列が使用されます。CONTAINS 句内の列は、単一テーブルから取得する必要があります。FROM 句に複数のテーブルが指定されている場合は、テーブル名で * を限定する必要があります。language_term を指定しない場合、テーブルのすべての列の言語は同じであることが必要です。
  • LANGUAGE language_term
    ユーザーがクエリを発行するときの言語を指定します。BLOB (Binary Large Object) として格納されているいくつかのドキュメントが列に含まれている場合、実際のドキュメントの内容に関するインデックス作成で使用される言語は、ドキュメントのロケール識別子 (LCID) によって決まります。したがって、1 列に複数の言語が格納されている可能性もあります。LANGUAGE パラメータにより、ユーザーは検索する言語を指定でき、これによって検索結果の一致率が高まります。

    このパラメータは省略可能で、言語の LCID に対応する文字列、整数、または 16 進数の値を指定できます。language_term を指定した場合、その言語は検索条件のすべての要素に適用されます。値を指定しなかった場合は、列のフルテキストの言語が使用されます。

    language_term を文字列で指定する場合は、syslanguages システム テーブルの alias 列の値と同じ値を指定します。文字列の場合は、'language_term' のように引用符 (') で囲む必要があります。language_term を整数で指定する場合は、その言語を表す実際の LCID を指定します。language_term を 16 進数の値で指定する場合は、「0x」の後に LCID の 16 進数の値を指定します。16 進数の値は、先頭の 0 を含め、8 桁以内で指定してください。

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

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

  • <contains_search_condition>
    column_name で検索するテキストと、その一致条件を指定します。

    contains_search_condition のデータ型は nvarchar です。入力に他の文字データ型が使用された場合は、暗黙の変換が行われます。次の例では、CONTAINS 述語において、varchar(30) として定義されている変数 @SearchWord が暗黙に変換されます。

    USE AdventureWorks;
    GO
    DECLARE @SearchWord varchar(30)
    SET @SearchWord ='performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    変換では "パラメータを見つけ出す" 動作が機能しないため、パフォーマンスの向上を目的とする場合には nvarchar を使用してください。この例では、@SearchWord を nvarchar(30) として宣言しています。

    USE AdventureWorks;
    GO
    DECLARE @SearchWord nvarchar(30)
    SET @SearchWord = N'performance'
    SELECT Description 
    FROM Production.ProductDescription 
    WHERE CONTAINS(Description, @SearchWord);
    

    最適化されていないプランが生成される場合には、OPTIMIZE FOR クエリ ヒントを使用することもできます。

  • word
    スペースまたは句読点なしの文字列です。
  • phrase
    単語の間をスペースで区切った 1 つ以上の単語です。

    ms187787.note(ja-jp,SQL.90).gifメモ :
    一部のアジア言語など、言語の中には、語句を構成するときに単語の間にスペースを挿入しないものがあります。
  • <simple_term>
    単語または語句に対する完全一致を指定します。有効な単純語の例として、"blue berry"、blueberry、および "Microsoft SQL Server" などがあります。語句は二重引用符 ("") で囲みます。データベース列での表示順と同様、語句内の単語は、<contains_search_condition> の指定と同じ順序で並んでいる必要があります。単語または語句内の文字の検索では、大文字と小文字を区別しません。フルテキスト インデックス化された列の a、and、the などのノイズ ワードは、フルテキスト インデックスには格納されません。1 つの単語の検索にノイズ ワードを使用した場合、SQL Server ではクエリにノイズ ワードだけが指定されていることを示すエラーが返されます。SQL Server では、SQL Server の各インスタンスのディレクトリ \Mssql\Binn\FTERef にノイズ ワードの標準リストがあります。

    区切り記号は無視されます。したがって、CONTAINS(testing, "computer failure") は、"Where is my computer?Failure to find it would be expensive." がある行に一致します。単語区切りの動作の詳細については、「ワード ブレーカとステミング機能」を参照してください。

  • <prefix_term>
    指定のテキストで始まる単語または語句の照合を指定します。プレフィックス語句を二重引用符 ("") で囲み、後ろの二重引用符の前にアスタリスク (*) を挿入すると、アスタリスクの前に指定された文字列で始まるすべてのテキストが照合されます。句は、CONTAINS (column, '"text*"') のように指定してください。アスタリスクは、一致する文字がないか、1 つまたはそれ以上の文字に一致します。その単語または語句を語根とする文字も対象になります。テキストとアスタリスクが二重引用符で区切られていないと、述語は CONTAINS (column, 'text*') を読み取り、フルテキスト検索でアスタリスクが文字と見なされ、text* への完全一致が検索されます。単語区切りでは通常このような文字は無視されるため、アスタリスク (*) 文字が付いた文字はフルテキスト エンジンによって検索されません。

    <prefix_term> が語句のときは、語句に含まれるそれぞれの単語が独立したプレフィックスと見なされます。したがって、"local wine *" というプレフィックスを指定しているクエリでは、"local winery"、"locally wined and dined"などの行が一致します。

  • <generation_term>
    指定されている原形の語または語句が、検索対象である元の単語の変形を含んでいる場合に、これらの単語も照合の対象であることを指定します。
  • INFLECTIONAL
    言語依存の語幹検索が、指定した単純語に対して使用されます。語幹検索の動作は、特定の各言語の語幹ルールに基づいて定義されます。あいまい言語には、関連する語幹検索がありません。クエリの対象となっている列の列言語は、必要な語幹検索を参照する場合に使用されます。language_term が指定されると、その言語に対応する語幹検索が使用されます。

    <generation_term> 内に指定された <simple_term> は、名詞と動詞のどちらにも一致しません。

  • THESAURUS
    列のフルテキスト言語に対応する類義語、またはクエリで指定された言語が使用されます。simple_term の最も長いパターンが類義語と照合され、追加の用語が生成されて、元のパターンを拡張するか置き換えます。simple_term の全体または一部に対して一致が見られない場合、一致しない部分が simple_term として処理されます。フルテキスト検索の類義語の詳細については、「類義語辞典」を参照してください。
  • <proximity_term>
    互いに近い位置に存在する単語や語句の照合を指定します。<proximity_term> は AND 演算子と同様に動作します。両方とも、検索される列に複数の単語や語句が存在することが必要です。<proximity_term> 内の単語が互いに近くにあるほど、一致度合いが高くなります。

    • NEAR | ~
      NEAR() または ~ 演算子の左側にある単語や語句が、NEAR() または ~ 演算子の右側にある単語や語句にほぼ近いことを示します。次に示すように、複数の近似語を NEAR でつないで指定できます。

      a NEAR b NEAR c 
      

      つまり、単語または語句 ab の近くに存在し、bc の近くに存在することを意味します。複数の近似語がつながっている場合、すべての近似語は互いに近くに存在している必要があります。したがって、a ~ b ~ c の例では、単語または語句 a は、単語または語句 c の近くに存在する必要があります。

  • <weighted_term>
    クエリによって取得された一致する行と、単語または語句のリストが照合されます。このリストの単語や語句のそれぞれには、オプションで重み値が指定されます。
  • ISABOUT
    <weighted_term> キーワードを指定します。

    • WEIGHT(weight_value)
      0.0 ~ 1.0 の間で重み値を指定します。<weighted_term> 内の各構成要素には、weight_value を指定できます。weight_value を指定すると、クエリの各部分が、クエリに一致するそれぞれの行に割り当てられている順位値に与える作用を変更することができます。WEIGHT は CONTAINS クエリの結果に影響しませんが、WEIGHT は CONTAINSTABLE クエリ内のランクに影響します。詳細については、「CONTAINSTABLE (Transact-SQL)」を参照してください。

      ms187787.note(ja-jp,SQL.90).gifメモ :
      小数点の記号は、オペレーティング システムのロケールに関係なく常にピリオドです。
  • { AND | & } | { AND NOT | &! } | { OR | | }
    2 つの contains 検索条件の間の論理演算を指定します。

    • AND | &
      一致条件として、2 つの contains 検索条件を満たすことを指定します。アンパサンド記号 (&) は、AND キーワードの代わりに使用して、AND 演算子を表すことができます。
    • AND NOT | &!
      一致条件として、2 番目の検索条件が除外されることを指定します。アンパサンドとその次の感嘆符 (&!) は、AND NOT キーワードの代わりに使用して、AND NOT 演算子を表すことができます。
    • OR | |
      一致条件として、2 つの contains 検索条件のいずれかを満たすことを指定します。垂直バー記号 (|) は、OR キーワードの代わりに使用して、OR 演算子を表すことができます。

      <contains_search_condition> 内にかっこで囲まれたグループが含まれる場合は、かっこで囲まれたグループが最初に評価されます。かっこで囲まれたグループを評価した後は、contains 検索条件で使用される論理演算子に対して次の規則が適用されます。

      • NOT は AND より先に適用されます。
      • NOT は AND NOT のように、AND の後にだけ指定できます。OR NOT 演算子は使用できません。NOT は最初の条件の前に指定できません。たとえば、CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' ) は無効になります。
      • AND は OR より先に適用されます。
      • 同じタイプの論理演算子 (AND、OR) は結合されるので、任意の順番で適用できます。
      • n
        複数の contains 検索条件と、条件内の複数の語を指定できることを示すプレースホルダです。

解説

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

A. CONTAINS を <simple_term> と共に使用する

次の例では、"Mountain" という単語を含み、価格が $80.99 であるすべての製品を検索します。

USE AdventureWorks;
GO
SELECT Name, ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
   AND CONTAINS(Name, 'Mountain');
GO

B. CONTAINS と <simple_term> 内の語句を使用する

次の例では、"Mountain" または "Road" のいずれかの語句が含まれている、すべての製品を返します。

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Mountain" OR "Road" ')
GO

C. CONTAINS を <prefix_term> と共に使用する

次の例では、Name 列の中で、chain というプレフィックスで始まる 1 つ以上の単語が含まれている、すべての製品名を返します。

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO

D. CONTAINS および OR を <prefix_term> と共に使用する

次の例では、"chain" または "full" のいずれかのプレフィックスを持つ文字列が含まれている、すべてのカテゴリ説明を返します。

USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO

E.. CONTAINS を <proximity_term> と共に使用する

次の例では、performance という単語の近くに bike という単語が存在する、すべての製品の名前を返します。

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO

F. CONTAONS を <generation_term> と共に使用する

次の例では、ride を原型とする riding、ridden などの単語が含まれている、すべての製品を検索します。

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO

G. CONTAINS を <weighted_term> と共に使用する

次の例では、performancecomfortable、または smooth という単語を含むすべての製品名を検索します。各単語にはそれぞれ異なる重み付けが割り当てられています。

USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), 
comfortable weight (.4), smooth weight (.2) )' );
GO

H. CONTAINS を変数と共に使用する

次の例では、特定の検索語ではなく変数を使用します。

USE AdventureWorks;
GO
DECLARE @SearchWord nvarchar(30)
SET @SearchWord = N'Performance'
SELECT Description 
FROM Production.ProductDescription 
WHERE CONTAINS(Description, @SearchWord);
GO

参照

関連項目

CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
WHERE (Transact-SQL)

その他の技術情報

フルテキスト検索
フルテキスト検索クエリ

ヘルプおよび情報

SQL Server 2005 の参考資料の入手

変更履歴

リリース 履歴

2006 年 4 月 14 日

新しい内容 :
  • contains_search_condition の変換の回避に関する情報を追加。

2007 年 9 月 15 日

新しい内容 :
  • 小数点の記号に関する注を ISABOUT の定義に追加しました。