在SQL查询中搜索句子中的单独单词?

时间:2013-04-09 16:30:43

标签: sql sql-server-2005 words

如果我有“Mens White Crew T-Shirt”的数据库条目,如果用户搜索“Mens T-Shirt”或“White T-Shirt”,我需要运行什么SQL查询才能返回该条目?< / p>

我使用的是Microsoft SQL Server 9:

使用时:

WHERE "Mens T-Shirt" like '%' + @SearchTerm + '%'

它没有带回“Mens White Crew T-Shirt”?

谢谢大家!

2 个答案:

答案 0 :(得分:3)

  

如果我有“Mens White Crew T-Shirt”的数据库条目,如果用户搜索“Mens T-Shirt”或“White T-Shirt”,我需要运行什么SQL查询才能返回该条目?< / p>

select *
from Products
where Description like '%' + replace(@SearchTerm, ' ', '%') + '%'
-- where 'Mens White Crew T-Shirt' like '%Mens%T-Shirt%' -- Returns true
-- where 'Mens White Crew T-Shirt' like '%White%T-Shirt%' -- Returns true

您可以通过替换(例如,连字符等其他字符),获得您想要的创意,但这有点像黑客。它并不适用于“男士”或“衬衫白”

实际上,这种类型的查询是Full-Text Search的全部内容,我的第二个a_horse_with_no_name建议使用它。

如果无法做到这一点,您可能需要沿着清理和拆分搜索词搜索列的路径,并动态创建查询。你最终可能会得到一些最终看起来像这样的东西(希望使用参数,来自你的应用程序):

exec sp_executesql N'
        select *
        from Products
        where Description like ''%'' + @SearchTerm1 + ''%''
            and Description like ''%'' + @SearchTerm2 + ''%''
            and Description like ''%'' + @SearchTerm3 + ''%''
            -- etc.',
    N'@SearchTerm1 varchar(100), @SearchTerm2 varchar(100), @SearchTerm3 varchar(100)',
    'Mens', -- What about "men" or "man", and this would still get "womens"
    'T', -- Any "T", yikes...possibly have to sanitize the column and search term to "tshirt"
    'Shirt'

但是这仍然不能涵盖FTS可以做到的所有事情,也可能没有那么快。

答案 1 :(得分:1)

您可以在用户搜索时为其提供选项,“包含完整的词组”或“包含所有词语”。确切的短语就是你现在正在做的事情。要对所有单词进行匹配,您需要先将搜索词拆分为单词,如下所示:

T-SQL Split String

请确保在使用此功能时将逗号更改为空格。然后,您可以在搜索从split函数返回的每个术语时添加WHERE子句:

WHERE Item LIKE '%Mens%'
AND Item LIKE '%T-Shirt%'

请注意,这与Tim的答案类似,只是在他的例子中,单词必须按正确顺序排列,而在这里他们没有。 (实际上 - 他的编辑也有这个想法。)

但重申一下,请查看全文搜索,因为如果你能够实现,那么你可能会比你这样做更快乐。