CONTAINS (Transact-SQL)
更新: 2006 年 4 月 14 日
這是一個用來搜尋資料行的述語,這些資料行包含以字元為基礎的資料類型,用來進行下列各種比對:單字或片語完全或部分 (較不精確) 相符、各字相距在一定距離內,或加權相符。
在 SQL Server 2005 中,您可以在 CONTAINS 或 FREETEXT 全文檢索述詞中,利用四部分名稱來針對連結伺服器執行查詢。
CONTAINS 可以搜尋下列項目:
- 單字或片語。
- 單字或片語的前置詞。
- 接近另一個單字的單字。
- 從另一個單字變化產生的單字 (如 drive 這個字是 drives、drove、driving 和 driven 等字的變化詞幹)。
- 在同義字典之中,另一個單字的同義字 (如 aluminum 和 steel 等字是 metal 的同義字)。
語法
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
這是包括在全文檢索索引中的一或多個資料行的名稱。char、varchar、nchar、nvarchar、text、ntext、image、xml 和 varbinary(max) 等類型的資料行是全文檢索搜尋的有效資料行。
- column_list
指出您可以指定多個資料行,各資料行用逗號分隔。column_list 必須括在括號中。除非您指定了 language_term,否則,column_list 所有資料行的語言必須相同。
- *
指定資料表中登錄了全文檢索搜尋的所有資料行,都應該用來搜尋給定的包含搜尋條件。CONTAINS 子句中的資料行必須來自單一資料表。如果 FROM 子句中有多個資料表,就必須用資料表名稱來限定 *。除非您指定了 language_term,否則,資料表所有資料行的語言必須相同。
LANGUAGE language_term
這是使用者用來發出查詢的語言。如果資料行包含幾份儲存成二進位大型物件 (BLOB) 的文件,用來建立實際文件內容索引的語言便由文件的地區設定識別碼 (LCID) 來決定。因此,單一資料行可以儲存多種語言。LANGUAGE 參數可讓使用者指定他們用來搜尋的語言,並因而增加良好符合的機率。這個參數是選擇性的,可以指定成對應於語言 LCID 的字串、整數或十六進位值。如果指定了 language_term,就會將它代表的語言套用至搜尋條件的所有元素上。如果未指定任何值,就會使用資料行全文檢索語言。
當指定為字串時,language_term 會對應至 syslanguages 系統資料表中的 alias 資料行值。字串必須以單引號括住,如 'language_term'。當指定為整數時,language_term 是用來識別語言的實際 LCID。當指定為十六進位值時,language_term 是 0x,後面接著 LCID 的十六進位值。十六進位值不能超出 8 位數,開頭的零也包括在內。
如果這個值是雙位元組字元集 (DBCS) 格式,SQL Server 會將它轉換成 Unicode。
如果指定的語言無效,或尚未安裝對應於這個語言的資源,SQL Server 就會傳回錯誤。若要使用中性語言資源,請在 language_term 中指定 0x0。
<contains_search_condition>
指定 column_name 中所要搜尋文字,以及相符條件。contains_search_condition 是 nvarchar。當使用另一個字元資料類型當作輸入時,會發生隱含轉換。在下列範例中,定義為
varchar(30)
的@SearchWord
變數會造成CONTAINS
述詞中的隱含轉換。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
這是一或多個單字,各個字之間有空格。附註: 部分語言 (如亞洲某些地區所撰寫的語言) 可能會有不用空格來分隔的一或多個單字所組成的片語。
<simple_term>
指定符合完整的單字或片語。"blue berry"、blueberry 和 "Microsoft SQL Server" 都是有效的簡單詞彙範例。片語應該用雙引號 ("") 括住。片語中的單字順序,應該依照 <contains_search_condition> 所指定,符合它們在資料庫資料行中的出現順序。在單字或片語中搜尋字元,並不區分大小寫。全文檢索索引資料行中的贅字 (如 a、and 或 the) 不會儲存在全文檢索索引中。如果在單字的搜尋中使用贅字,SQL Server 會傳回一則錯誤訊息,指出查詢只包含贅字。在每個 SQL Server 執行個體的 \Mssql\Binn\FTERef 目錄中,SQL Server 都併入了一份標準贅字清單。系統不處理標點符號。因此,
CONTAINS(testing, "computer failure")
將符合含有此值的資料列:"Where is my computer?Failure to find it would be expensive"。如需有關斷詞工具的詳細資訊,請參閱<斷詞工具與詞幹分析器>。
<prefix_term>
指定符合開頭是指定文字的單字或片語。請用雙引號 ("") 括住前置詞彙,在後引號的前面加上星號 (*),以便找出所有開頭是星號前面所指定之簡單詞彙的文字。這個子句的指定方式應該如下:CONTAINS (column, '"text*"')
。星號符合 (單字或片語中一或多個根單字的) 零個、一個或多個字元。如果並未用雙引號來分隔文字和星號,述詞便是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 或 ~ 運算子右側的單字或片語。您可以將多個相近詞彙鏈結起來,例如:a NEAR b NEAR c
這表示 a 單字或片語應該接近 b 單字或片語,b 單字或片語也應該接近 c 單字或片語。當您將多個相近詞彙鏈結起來時,所有相近詞彙都必須互相接近。因此,在
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)>。附註: 無論作業系統地區設定為何,小數分隔符號一律是句點。
{ AND | & } | { AND NOT | &!} | { OR | | }
指定兩個包含搜尋條件之間的邏輯運算。- AND | &
指出相符項目必須符合這兩個包含搜尋條件。您可以利用 & 符號取代 AND 關鍵字來表示 AND 運算子。
- AND NOT | &!
指出相符項目不能有第二個搜尋條件。您可以利用 & 後面接著驚歎號 (&!) 取代 AND NOT 關鍵字來表示 AND NOT 運算子。
OR | |
指出相符項目必須符合兩個包含搜尋條件的其中之一。您可以利用垂直線符號 (|) 取代 OR 關鍵字來表示 OR 運算子。當 <contains_search_condition> 包含附加括號的群組時,會先評估這些附加括號的群組。在評估附加括號的群組之後,當在包含搜尋條件中使用這些邏輯運算子,便適用下列規則:
- NOT 不在 AND 前面。
- NOT 只能在 AND 之後,如同 AND NOT。不允許 OR NOT 運算子。不能在第一個詞彙前面指定 NOT。例如,
CONTAINS (mycolumn, 'NOT "phrase_to_search_for" ' )
無效。 - AND 的套用先於 OR。
- 同類型的 Boolean 運算子 (AND、OR) 是聯合的,因此,套用順序沒有任何限制。
- n
這是一個預留位置,表示可以指定多個包含搜尋條件及其中的詞彙。
- AND | &
備註
如果相容層級低於 70,就不會將 CONTAINS 視為關鍵字。如需詳細資訊,請參閱<sp_dbcmptlevel (Transact-SQL)>。
範例
A. 搭配 <simple_term> 使用 CONTAINS
下列範例會尋找所有價格是 $80.99
,且含有 "Mountain"
這個單字的產品。
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. 搭配 <prefix_term> 使用 CONTAINS
下列範例會傳回所有至少有一個字的開頭是 Name
資料行中之前置詞鏈結的產品名稱。
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, ' "Chain*" ');
GO
D. 搭配 <prefix_term> 使用 CONTAINS 和 OR
下列範例會傳回所有包含前置詞為 "chain"
或 "full"
的字串之類別目錄描述。
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE CONTAINS(Name, '"chain*" OR "full*"');
GO
E. 搭配 <proximity_term> 使用 CONTAINS
下列範例會傳回所有 performance
這個字附近有 bike
這個字的產品名稱。
USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, 'bike NEAR performance');
GO
F. 搭配 <generation_term> 使用 CONTAINS
下列範例會搜尋所有含 ride
一字下列各種形式的產品:riding、ridden 等等。
USE AdventureWorks;
GO
SELECT Description
FROM Production.ProductDescription
WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ');
GO
G. 搭配 <weighted_term> 使用 CONTAINS
下列範例會搜尋所有包含 performance
、comfortable
或 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)
其他資源
說明及資訊
變更歷程記錄
版本 | 歷程記錄 |
---|---|
2006 年 4 月 14 日 |
|
2007 年 9 月 15 日 |
|