0

如果我有一个“男士白色圆领 T 恤”的数据库条目,如果用户搜索“男士 T 恤”或“白色 T 恤”,我需要运行什么 SQL 查询来返回该条目?

我正在使用 Microsoft SQL Server 9:

使用时:

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

它不会带回“男士白色圆领 T 恤”吗?

感谢大家!

4

2 回答 2

3

如果我有一个“男士白色圆领 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 可以涵盖的所有内容,而且可能不会那么快。

于 2013-04-09T19:21:36.697 回答
1

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

T-SQL 拆分字符串

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

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

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

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

于 2013-04-09T19:53:12.160 回答