2011-08-05 106 views
3

有人可以向我解釋這個嗎?我有兩個查詢以及他們的結果。SQL包含問題


查詢

select * from tbl where contains([name], '"*he*" AND "*ca*"') 

結果集

赫茲租車

Hemingyway的小酒吧


查詢

select * from tbl where contains([name], '"*he*" AND "*ar*"') 

結果集

什麼


釷第一個查詢是我期望的,但是我期望第二個查詢返回「Hertz Car Rental」。我從根本上誤解'*'如何在全文搜索中起作用?

謝謝!

回答

5

我想SQL Server正在將你的字符串解釋爲prefix_terms。星號不是普通的舊通配符說明符。全文和包含是面向字的。對於你想要做的事情,你最好使用普通的舊LIKE而不是CONTAINS。

http://msdn.microsoft.com/en-us/library/ms187787.aspx

+1

+1'*'通配符只能用於前綴匹配,模式字符串中的第一個必須在第一個示例中被忽略。 @hatchet是正確的推薦使用LIKE來代替這個用法(或者只是將通配符全部放在一起,如果你真的想要「模糊」匹配?) – brandx

+0

我想我是從根本上誤解了一切,不是我。澄清。我想我們會去搜索前綴,因爲我們已經確定LIKE不夠高性能。 –

-1

我會嘗試用%替換*來看看它是怎麼回事。

select * from tbl where contains([name], '"%he%" AND "%ar%"') 
+1

那什麼都不做。 CONTAINS不喜歡。 – Stu

+1

'%'vs'*'似乎不會破壞第一個查詢;爲什麼它會搞亂第二個呢? – cHao

4

「*」只能用作後綴。如果您將它用作前綴,則無論如何索引都無用,該表需要進行掃描。在這一點上,你不妨做

Select * From Table Where (Name Like '%he%') And (Name Like '%ar%') 
+0

非常好,謝謝! –