是一個述語,用來搜尋包含字元資料型別的資料行中精確或模糊 (比較不精確) 符合單字或片語,與文字在特定距離內的文字或加權匹配。CONTAINS 可以搜尋︰
單字或片語。
單字或片語的字首。
接近另一個字的單字。
由另一個字變化而來的單字 (例如,單字 drive 可變化出 drives、drove、driving 與 driven)。
比另一個字的指定加權還高的單字。
您可以使用 CONTAINS 述詞 (Predicate) 來搜尋資料庫中的特定片語。當然,這樣的查詢也可以寫成 LIKE 述詞。不過,許多 CONTAINS 形式提供的文字查詢功能遠比 LIKE 來得多。此外,與使用 LIKE 述詞不同的是,CONTAINS 搜尋一定不區分大小寫。
附註 對於有必要區分大小的語言 (大部分拉丁語系),全文檢索搜尋查詢才會以不區分大小寫的方式運作。但在日文裏,有多重發音拼字法,它的拼音正規化概念就類似不區分大小寫 (例如,kana = insensitivity)。這類拼字法正規化並未支援。
假設要在 Northwind 資料庫中搜尋 "bean curd" 這個片語。若您使用 CONTAINS 述詞,這將是非常簡單的查詢。
USE Northwind
GO
SELECT Description
FROM Categories
WHERE Description LIKE '%bean curd%'
GO
或者,使用 CONTAINS:
USE Northwind
GO
SELECT Description
FROM Categories
WHERE CONTAINS(Description, ' "bean curd" ')
GO
CONTAINS 述詞使用函數表示法,把第一個參數作為搜尋資料行的名稱,第二個參數做為全文檢索搜尋的條件。搜尋條件 (這裏是 "bean curd") 有時候相當複雜,並由多個詞彙組成,這將在稍後描述。
CONTAINS 述詞支援複雜的語法,可在字元資料行中搜尋:
字組是指沒有空白或標點的一或多個字元。有效片語可包含多個字組與空白,其中可能有也可能沒有標點。例如,croissant 是一個字組,而 café au lait 則是一個片語。這類字組與片語稱為簡單詞彙。
例如,搜尋 drive 這個字的字形變化如果資料表的資料列中有 drive、drives、drove、driving 與 driven,就都會出現在結果集中,因為這都是由 drive 這個字產生的字形變化
對於片語,片語中的每個字組都是一個前置詞。例如,auto tran* 這一項符合自動傳輸 (automatic transmission) 與汽車能量轉換器 (automobile transducer)。
例如,若要尋找指定加權高於其他字組的字組。它會傳回分級的查詢結果。
例如,可以尋找 ice 這個字在 hockey 字附近的資料列,或 ice skating 片語在 ice hockey 片語附近的資料列.
CONTAINS 述詞可以使用 AND 與 OR,結合數個這類項目,例如,在同一個啟用全文檢索資料庫資料行中尋找內含 latte 與 New York-style bagel 的資料列。此外,使用 AND NOT 可以取消某些項,例如包含 bagel 但不包含 cream cheese。
使用 CONTAINS 時請記住,SQL Server 會丟棄搜尋條件中的干擾字組。干擾字組是指 a、and、is 或 the 等,這類字經常出現,但對於搜尋特定文字卻沒有實質幫助。
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
為註冊全文搜尋的資料行名稱。字元字串資料型別的資料行是有效的全文搜尋資料行。
*
指定資料表中登錄為全文檢索的所有資料行都用來搜尋包含搜尋條件。如果 FROM 子句中有多個資料表,則 * 必須用資料表名稱來驗證。
指定 column 中要搜尋的部份文字。無法在搜尋條件中使用變數。
word
是無空格或標點符號的字元字串。
phrase
是每個字之間有空格的一個或多個字。
附註 部份語言 (例如亞洲語言) 的片語中可以包含一個或多個字,且其間沒有空格。
< simple_term >
指定符合正確的字 (在單位元組語言中無空格或標點符號的一個或多個字元) 或片語 (在單位元組語言中以空格或標點符號隔開的一個或多個連續字)。有效的簡單辭彙如 "blue berry"、blueberry 與 "Microsoft SQL Server"。片語應以雙引號 ("") 括住。片語中的字必須依照
標點符號會予以忽略。因此,CONTAINS(testing, "computer failure") 會找出資料列中相符的值:"Where is my computer?Failure to find it would be expensive."。
指定符合以指定文字為開頭的單字或片語。 以雙引號 ("") 括住前置詞,並且在結尾的雙引號之前加入星號 (*),這樣,以星號之前所指定簡單字詞為開頭的所有文字都會符合。 此子句應該指定如下:星號可符合 (根字或單字或片語的) 零個、一或多個字元。 如果未使用雙引號分隔文字及星號,例如:CONTAINS (column, 'text*'),則全文檢索會將星號視為字元,並且將搜尋完全符合 text* 的資料。
當片語中有
指定所含的簡單辭彙包含要搜尋的原始單字的變化時要符合該字。
在
指定要符合的單字或片語必須接近另一個字。
a NEAR b NEAR c
這表示單字或片語 a 應該近似單字或片語 b,而 b 應該近似單字或片語 c。
Microsoft® SQL Server™ 排列左邊與右邊文字或片語的距離的順序。低順序值 (例如 0) 表示兩個字相差太遠。如果指定的單字或片語相差太遠,則可考慮滿足查詢,但查詢的順序值很低 (0)。不過,如果
指定符合的資料列 (由查詢傳回) 符合單字或片語清單,選擇性地各指定加權值。
AND | AND NOT | OR
指定兩個包含搜尋條件之間的邏輯運算。當
n
是指出可在其中指定多個包含搜尋條件和辭彙的替代符號。
如果相容層級低於 70,不會將 CONTAINS 當作關鍵字。如需詳細資訊,請參閱 sp_dbcmptlevel。
這一範例會找出價格為 $15.00 且包含單字 "bottles" 的所有產品。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE UnitPrice = 15.00
AND CONTAINS(QuantityPerUnit, 'bottles')
GO
這一範例會傳回包含片語 "sasquatch ale" 或 "steeleye stout" 的所有產品。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "sasquatch ale" OR "steeleye stout" ')
GO
這一範例會傳回 ProductName 資料行中至少有一個字以字首 chos 開頭的所有產品的名稱。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' "choc*" ')
GO
這一範例會傳回包含字串 " sea" 或 "bread" 的所有類別描述。
USE Northwind
SELECT CategoryName
FROM Categories
WHERE CONTAINS(Description, '"sea*" OR "bread*"')
GO
這一範例會傳回具有近似 "spread" 的單字 "Boysenberry" 的所有產品的名稱。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, 'spread NEAR Boysenberry')
GO
這一範例會搜尋具有單字 dry 的各種形式的所有產品:dried、drying 等等。
USE Northwind
GO
SELECT ProductName
FROM Products
WHERE CONTAINS(ProductName, ' FORMSOF (INFLECTIONAL, dry) ')
GO
這一範例會搜尋包含單字 "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
本範例將使用變數取代特定的搜尋字詞。
USE pubs GO DECLARE @SearchWord varchar(30) SET @SearchWord ='Moon' SELECT pr_info FROM pub_info WHERE CONTAINS(pr_info, @SearchWord)