2011-10-07 33 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