2

我目前有一个基于接收参数搜索字符串(例如“Netgear WiFI Switch”)设置的 SQL 存储过程,该存储过程然后对此.ie 进行通配符 LIKE 搜索

WHERE COL1 LIKE '%Netgear WiFi Switch'%

这很好用,但是我想通过搜索任何单词来详细说明这一点。例如,示例查询会因为顺序不同而错过显示“Netgear Switch WiFi”的产品。

所以我需要拆分单词并对每个单词进行通配符搜索。(%Netgear% 和 %Switch% 和 %WiFi%)

所以我的问题是我将如何开始考虑将字符串拆分为必要的单词,将这些应用于变量,然后根据从搜索字符串的拆分中创建了多少变量来执行动态 WHERE。

谢谢

4

3 回答 3

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

于 2012-11-05T19:23:41.427 回答
0

我将创建一个 t-sql 函数,该函数采用该短语(一组单词)并将其按空格分隔,然后根据您的算法搜索该列文本值。这样,您仍然可以将逻辑嵌入到 where 子句中。它是抽象的,因此该函数可以在代码的其他区域中重用。

这可能适用于简单的搜索。搜索多个单词可能会更难,您需要进行硬编码查找。索引不会起作用,因为在每次行迭代时都会评估函数。

于 2012-11-05T13:35:29.607 回答
-1

我建议您使用 Lucene 或 Solr 进行搜索。在通过使用文本索引来处理这些单词组合时,它们比使用 SQL 查询要高效得多。如果您仍想在 SQL 中搜索文本,更好的解决方案是使用布尔搜索:

布尔全文搜索

您可以将字符串拆分为多个单词标记。然后,您可以消除所有常用词(只有 2 个字符或更少或非常常用的词,如 "for"、"with" 等)。之后,您可以使用 + 或 - 运算符进行查询。另一个优化是存储经常搜索的短语。但这可能超出了您的问题范围。希望能帮助到你 :)

于 2012-11-05T12:27:06.230 回答