如果我有“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”?
谢谢大家!
答案 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)
您可以在用户搜索时为其提供选项,“包含完整的词组”或“包含所有词语”。确切的短语就是你现在正在做的事情。要对所有单词进行匹配,您需要先将搜索词拆分为单词,如下所示:
请确保在使用此功能时将逗号更改为空格。然后,您可以在搜索从split函数返回的每个术语时添加WHERE子句:
WHERE Item LIKE '%Mens%'
AND Item LIKE '%T-Shirt%'
请注意,这与Tim的答案类似,只是在他的例子中,单词必须按正确顺序排列,而在这里他们没有。 (实际上 - 他的编辑也有这个想法。)
但重申一下,请查看全文搜索,因为如果你能够实现,那么你可能会比你这样做更快乐。