如果我有一个“男士白色圆领 T 恤”的数据库条目,如果用户搜索“男士 T 恤”或“白色 T 恤”,我需要运行什么 SQL 查询来返回该条目?
我正在使用 Microsoft SQL Server 9:
使用时:
WHERE "Mens T-Shirt" like '%' + @SearchTerm + '%'
它不会带回“男士白色圆领 T 恤”吗?
感谢大家!
如果我有一个“男士白色圆领 T 恤”的数据库条目,如果用户搜索“男士 T 恤”或“白色 T 恤”,我需要运行什么 SQL 查询来返回该条目?
我正在使用 Microsoft SQL Server 9:
使用时:
WHERE "Mens T-Shirt" like '%' + @SearchTerm + '%'
它不会带回“男士白色圆领 T 恤”吗?
感谢大家!
如果我有一个“男士白色圆领 T 恤”的数据库条目,如果用户搜索“男士 T 恤”或“白色 T 恤”,我需要运行什么 SQL 查询来返回该条目?
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
您可以通过替换(例如,连字符等其他字符)获得您想要的创意,但这有点像 hack。它不适用于“男士”或“衬衫白”
真的,这种类型的查询就是全文搜索的全部内容,我赞同 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 可以涵盖的所有内容,而且可能不会那么快。
您可以在用户进行搜索时为他们提供“包含精确短语”或“包含所有单词”的选项。确切的短语是您现在正在做的事情。要对所有单词进行匹配,您需要首先将搜索词拆分为单词,如下所示:
只需确保在使用该功能时将逗号更改为空格即可。然后,您可以在搜索中添加一个 WHERE 子句,以搜索从您的 split 函数返回的每个术语:
WHERE Item LIKE '%Mens%'
AND Item LIKE '%T-Shirt%'
请注意,这与蒂姆的答案相似,只是在他的示例中,单词必须按正确的顺序排列,而在这里它们没有。(实际上——他的编辑也有这个想法。)
但重申一下,请查看全文搜索,因为如果您可以实现它,您可能会比您可以这样做更快乐。