我目前有一个基于接收参数搜索字符串的SQL存储过程(例如'Netgear WiFI Switch'),然后存储过程对此.i.e进行通配符LIKE搜索。
WHERE COL1 LIKE '%Netgear WiFi Switch'%
这很好但是我想通过搜索任何单词来详细说明。例如,由于订单不同,示例查询会错过说“Netgear Switch WiFi”的产品。
所以我需要拆分单词并对每个单词进行通配符搜索。 (%Netgear%AND%Switch%AND%WiFi%)
所以我的问题是我将如何开始将字符串拆分为必要的单词,将这些字符串应用于变量,然后根据从搜索字符串的拆分中创建了多少变量来执行动态WHERE。
谢谢
答案 0 :(得分:2)
你可以使用sql server FULLTEXT搜索它将非常容易和有效。如果你不喜欢启用全文搜索使用以下查询它会给你基本的想法如何处理
DECLARE @keyword varchar(100)='Project'
-- remove double spaces
while CHARINDEX(' ',@keyword) > 1
begin
SET @keyword=REPLACE(@keyword,' ',' ')
end
SET @keyword=REPLACE(@keyword,' ','%'' AND COL1 LIKE ''%')+'%'''
DECLARE @str varchar(max)=''
SET @str='SELECT COL1 FROM dbo.table
WHERE COL1 Like ''%'+ @keyword
EXEC (@str)
您可以使用execute_sql而不是exec
答案 1 :(得分:0)
我会创建一个t-sql函数,它接受该短语(单词集)并将其拆分为空格,然后根据您的算法搜索该列文本值。这样你仍然可以将你的逻辑嵌入到where子句中。它是抽象的,因此该函数可以在代码的其他区域重复使用。
这可能适用于简单搜索。搜索多个单词可能更难,您需要进行硬编码查找。索引不起作用,因为在每次迭代迭代时都会计算函数。
答案 2 :(得分:-1)
我建议您使用Lucene或Solr进行搜索。它们比使用SQL查询通过使用文本索引处理这些单词组合更有效。如果您仍想在SQL中搜索文本,更好的解决方案是使用布尔搜索:
您可以将字符串拆分为多个单词标记。然后,你可以消除所有常用词(只有2个字符或更少或非常常见的词,如“for”,“with”等)。之后,您可以使用+或 - 运算符进行查询。另一种优化是存储常用的短语。但这可能超出了你的问题的范围。希望它有所帮助:)