2011-10-07 46 views
8

我在表上運行兩個查詢。SQL:Like vs Contains - 不同的結果

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, 'STYCAST') 

而且

SELECT MSDS FROM dbo.MSDSSearch3 WHERE MSDS like '%STYCAST%' 

第一個查詢將返回

'STYCAST 50300 LV' 

而第二個將返回

'STYCAST 50300 LV' 
'STYCAST 2851 BLACK' 

有誰知道爲什麼好像會比返回多個值包含?我運行的包含有問題嗎?提前致謝。

+0

什麼版本的SQL Server?如果你使用'SELECT * FROM sys.dm_fts_parser(''STYCAST 2851 BLACK'',1033,0,0)''''''我可以看到解析器的一些可見性''我看不到爲什麼字符串會被區別對待的任何原因。 –

+3

有趣的問題,你確定這兩個值是完全一樣的嗎?因爲沒有前導/尾隨空白字符。這可能會導致此問題,因爲CONTAINS將與您的文本完全匹配,而LIKE會匹配您的文本+任何一側的任何一方 – Purplegoldfish

+11

聽起來就像您的全文目錄過期了。您可能想嘗試使用[ALTER FULLTEXT CATALOG]重建它(http://msdn.microsoft.com/zh-cn/library/ms176095.aspx)。 –

回答

2

CONTAINS是一個完全不同的函數,它是一個基於謂詞的全文索引查詢;它不是一個函數來確定列是否包含一個字符串。

對於查詢您正在運行,你可以這樣做:

SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS, '"STYCAST*"') 

有你有一個前綴搜索,而不是simple_term搜索像您目前擁有。

更多細節:http://msdn.microsoft.com/en-us/library/ms187787.aspx


也許在你的方式使用它「STYCAST 2851 BLACK」不落入結果的文本,因爲它比「STYCAST 50300 LV的一個或多個字符,所以這是17場比賽中的7場對比16場比賽中的7場。我不確定,但這可以解釋這種奇怪的行爲。

+0

剛剛測試過這個解決方案,結果相同。 SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS,'STYCAST *'') 還是返回了一個值。 – Corey

+0

很難讀懂;那麼它應該是一個過時的目錄,但是你說你已經更新了它。這很奇怪。 – daniloquio

+0

如果您運行此操作:SELECT MSDS FROM dbo.MSDSSearch3 WHERE CONTAINS(MSDS,'STYCAST 2851 BLACK')? – daniloquio