2012-11-05 182 views
0

我目前有一个基于接收参数搜索字符串(例如'Netgear WiFI Switch')设置的SQL存储过程,存储过程然后在其上执行通配符LIKE搜索这个.ie基于单词的SQL搜索查询

WHERE COL1 LIKE '%Netgear WiFi Switch'% 

这工作得很好,但我想通过搜索任何单词来详细说明此问题。例如,由于订单不同,示例查询会漏掉那些说'Netgear Switch WiFi'的产品。

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

所以我的问题是我将如何开始将字符串拆分成必要的单词,将这些字符串应用到变量,然后根据多少个动态WHERE已经从分割搜索字符串创建了变量。

谢谢

+0

您应该指定您的SQL平台,因为这可能是特定于平台的 – podiluska

+0

我正在使用Microsoft SQL 2005 – rmon2852

回答

1

可以使用SQL Server全文搜索将是非常简单而有效的。如果你不喜欢,使全文搜索使用以下查询它会给你基本思路如何对待

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

+0

明智的答案,全文选项和代码都能正常工作 – rmon2852

-1

我建议你使用Lucene或Solr进行搜索。通过使用文本索引,它们比使用SQL查询处理这些文字组合效率更高效。如果你仍然想搜索的文本SQLS,较好的解决办法是使用布尔搜索:

Boolean Full-Text Searches

您可以将字符串分割成若干字标记。然后,您可以删除所有常见单词(只有2个字符或更少或非常常见的单词,如“for”,“with”等)。之后,您可以使用+或 - 运算符进行查询。另一个优化是存储通常搜索的短语。但它可能超出了你的问题的范围。希望它可以帮助:)

0

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

这可能适用于简单搜索。搜索多个单词可能会更困难,您需要一个硬编码的查找。索引不起作用,因为函数是在每一行迭代中计算的。