文字ベースのデータ型を含む列で、完全一致検索またはあいまい検索に該当する単語または語句、特定の範囲内で近くにある単語、重み付けした検索などを実行するのに使用する述語です。以下に CONTAINS の検索対象を示します。
- 単語または語句。
- 単語または語句のプレフィックス。
- 別の単語の近くにある単語。
- ほかの単語を語形変化して生成した単語。たとえば、drive という単語からは、drives、drove、driving、driven などの単語が生成されます。
- ほかより重みが高く設定されている単語。
構文
CONTAINS
( { column | * } , '< contains_search_condition >'
)
< 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 , < 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 ]
)
引数
column
フルテキスト検索用に登録されている特定の列の名前です。文字列データ型の列は、有効なフルテキスト検索列です。
*
与えられた contains 検索条件での検索には、フルテキスト検索に登録されたテーブル内のすべての列を使用する必要があることを示します。FROM 句に複数のテーブルが指定されている場合は、テーブル名で * を限定する必要があります。
<contains_search_condition>
column 内で検索するテキストを指定します。検索条件には変数は使用できません。
word
スペースまたは句読点なしの文字列です。
phrase
単語の間をスペースで区切った 1 つ以上の単語です。
注 アジア言語など、言語の中には、語句を構成するときに単語の間にスペースを挿入しないものがあります。
<simple_term>
完全に一致する単語 (シングルバイト言語でスペースまたは句読点を含まない 1 つ以上の文字) または語句 (1 バイト言語でスペースやオプションの区切り記号で区切られた 1 つ以上の連続した単語) の照合を指定します。有効な単純語の例として、"blue berry"、blueberry、および "Microsoft SQL Server" などがあります。語句は二重引用符 ("") で囲んでください。データベース列での表示順と同様、語句内の単語は、<contains_search_condition> の指定と同じ順序で並んでいる必要があります。単語または語句内の文字の検索では、大文字と小文字を区別しません。フルテキスト インデックス化された列の a、and、the などのノイズ語は、フルテキスト インデックスには格納されません。1 つの単語の検索にノイズ語を使用した場合、SQL Server ではクエリにノイズ語だけが指定されていることを示すエラーが返されます。SQL Server では、標準のノイズ語一覧が \Mssql\Ftdata\Sqlserver\Config にあります。
区切り記号は無視されます。したがって、CONTAINS(testing, "computer failure") は、"Where is my computer? Failure to find it would be expensive." を含む列に一致します。
<prefix_term>
指定のテキストで始まる単語または語句の照合を指定します。プレフィックス語句を二重引用符 ("") で囲み、後ろの二重引用符の前にアスタリスク (*) を挿入すると、アスタリスクの前に指定された文字列で始まるすべてのテキストが照合されます。この句は、CONTAINS (column, '"text*"') のように指定します。アスタリスクは、0 または 1 つ以上の文字に一致します。その単語または語句を語根とする文字もこれに含まれます。CONTAINS (column, 'text*') のように、テキストとアスタリスクが二重引用符で区切られていないと、フルテキスト検索でアスタリスクが文字と見なされ、text* に対する完全一致が検索されます。
<prefix_term> が語句のときは、語句に含まれるそれぞれの単語が独立したプレフィックスと見なされます。したがって、"local wine *" というプレフィックスを指定しているクエリでは、"local winery"、"locally wined and dined"などの行が一致します。
<generation_term>
指定されている原形の語または語句が、検索対象である元の単語の変形を含んでいる場合に、これらの単語も照合の対象であることを指定します。
- INFLECTIONAL
- 複数形と単数形を初め、名詞、動詞、および形容詞の男性形、女性形、および中性形が照合の対象であることを指定します。また、時制の異なる動詞も照合の対象です。
<generation_term> 内の与えられた <simple_term> は名詞と動詞のどちらにも一致しません。
<proximity_term>
互いに近くにある単語または語句の照合を指定します。<proximity_term> は、AND 演算子と同様に機能します。どちらの場合も、検索している列に 2 つ以上の単語または語句があることが必要です。<proximity_term> 内の単語が互いに近くにあるほど、一致度合いが高くなります。
- NEAR | ~
- NEAR() または ~ 演算子の左側にある単語または語句が NEAR() または ~ 演算子の右側にある単語または語句にほぼ近いことを示します。次に示すように、複数の近似語を NEAR でつないで指定できます。
a NEAR b NEAR c
つまり、単語または語句 a が b に近く、b が c に近いことを意味します。
Microsoft® SQL Server™ は、右側と左側にある単語または語句の間の距離に対して順位を決めます。たとえば 0 などの低い順位値は、2 つの単語または語句が大きく離れていることを示します。指定の単語または語句が互いに大きく離れている場合、クエリの目的は達成されますが、クエリの順位値は非常に低く (0) なります。ただし、<contains_search_condition> が 1 つ以上または複数の NEAR 隣接語だけで構成される場合、SQL Server では順位値が 0 の行を返しません。順位の詳細については、「CONTAINSTABLE」を参照してください。
<weighted_term>
クエリの結果一致する行が、それぞれオプションで重み値を与えられた一連の単語または語句に一致するように指定します。
- ISABOUT
- <weighted_term> キーワードを指定します。
- WEIGHT (weight_value)
- 0.0 ~ 1.0. の間で重み値を指定します。<weighted_term> 内の各構成要素には、weight_value を指定できます。weight_value を指定すると、クエリの各部分が、クエリに一致するそれぞれの行に割り当てられている順位値に与える作用を変更することができます。<weighted_term> のすべての構成要素を一緒に使用して照合されるため、重みを割り当てることで、値のランクをさまざまな方法で判断できるようになります。重みが割り当てられているかどうかにかかわらず、ISABOUT パラメータのいずれかで一致が見つかると、1 行が返されます。返された行の一致度合いを示す順位値の詳細については、「CONTAINSTABLE」を参照してください。
AND | AND NOT | OR
2 つの contains 検索条件の間の論理演算を指定します。<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」を参照してください。
例
A. CONTAINS を <simple_term> と共に使用する
この例では、"bottles" という単語を含み、価格が $15.00 であるすべての製品を検索しています。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
AND CONTAINS(QuantityPerUnit, 'bottles')
GO
B. CONTAINS と <simple_term> 内の語句を使用する
この例では、"sasquatch ale" または "steeleye stout" という語句を含むすべての製品を返します。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ')
GO
C. CONTAINS を <prefix_term> と共に使用する
この例では、ProductName 列の中で、choc というプレフィックスで始まる 1 つ以上の単語で構成されるすべての製品名を返します。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO
D. CONTAINS と OR を <prefix_term> と共に使用する
この例では、"sea" または "bread" という文字列を含むすべてのカテゴリ説明を返します。
USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO
E. CONTAINS を <proximity_term> と共に使用する
この例では、"spread" という単語の近くに "Boysenberry" という単語があるすべての製品の名前を返します。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO
F. CONTAINS を <generation_term> と共に使用する
この例では、dried や drying などのように、dry を語尾変化させた単語を含むすべての製品を検索しています。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO
G. CONTAINS を <weighted_term> と共に使用する
この例では、spread、sauces、または relishes という単語を含むすべての製品名を検索します。各単語にはそれぞれ異なる重みが割り当てられています。
USE Northwind
GO
SELECT CategoryName, Description
FROM Categories
WHERE CONTAINS(Description, 'ISABOUT (spread weight (.8),
sauces weight (.4), relishes weight (.2) )' )
GO
H. CONTAINS と変数と共に使用する
この例では、特定の検索語ではなく変数を使用します。
USE pubs
GO
DECLARE @SearchWord varchar(30)
SET @SearchWord ='Moon'
SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)
関連項目
FREETEXT
FREETEXTTABLE
WHERE