在sql中是否还有“like”运算符的替代方法 - 用于搜索数据

时间:2012-10-25 19:05:06

标签: sql sql-server sql-server-2008 tsql sql-server-2005

我需要一些帮助,我根据条件提取数据

这里我使用的是类似运算符,其中客户端可以使用任何单词搜索,因此我有以下逻辑,但这里检索时间太长(需要4分钟)才能获得太慢的数据。

我对表进行了所有索引,但仍然无法优化查询。

从作者中选择* where(地址如'%Walmart%'或地址如'Walmart%'或地址如'%Walmart'或地址如'%Walmart.com%'或地址如'Walmart.com%'或地址如'%Walmart.com '或地址如'%Walmarts%'或地址如'Walmarts%'或地址如'%Walmarts'或地址如'%Walmarts.com%'或地址如'Walmarts.com%'或地址如'%Walmarts.com ')

- 结果为1行

如果我遵循这个逻辑

从作者中选择*     地址如'%Walmart%'

- 结果是44行 - 它正在获取所有行

但我只需要那一行

6 个答案:

答案 0 :(得分:3)

我相信这是where子句中唯一需要的东西,它应涵盖包含该词的所有内容:

select * from authors
where address like '%' + @word + '%'

您实际上已经在where子句的第二行执行此操作:

or like '%'+@word+'%'

这涵盖了所有内容,使其他所有内容过多。删除它们可能会加快一点:

declare @title varchar(20)

set @title = 'coll' set @title = LTRIM(rtrim(@title))

select * from authors
where address like '%'+@title+'%'

答案 1 :(得分:2)

索引很可能无济于事。在许多情况下,使用Like语句时,不能使用索引。您允许的搜索类型非常低效。更有可能的是,此查询将扫描地址表。如果表中有相当多的行,这将需要很长时间,正如您所看到的那样。

您可能最好不要查看全文searching

答案 2 :(得分:2)

如果您希望在文本列中获得正确的性能,则需要使用全文搜索。

http://msdn.microsoft.com/en-us/library/ms142571.aspx

答案 3 :(得分:0)

像这样的通配符搜索将无法被索引帮助,请尝试查看全文搜索

这将使用索引,它可能会进行搜索

address like @wordcom+' %

这不会使用索引,它必须扫描整个索引

address like '% '+@wordcom+' %'

如上所述,请使用全文搜索

答案 4 :(得分:0)

正如其他人所说,你所需要的只是

select * from authors where address like '%' + @word + '%'

如果优化器弄清楚我们告诉你的是什么,这可能不会加快速度。 (指数也无济于事,其他人建议使用全文搜索)。

如果您无法获得上述查询的原因,请查看您的查询:

select * from authors
where address like @word or address like '% '+ @word
 or address like @word+' %' or address like '%'+@word+'%'
 or address like '% '+@word+' %' or address like @words
 or address like '% '+@words or address like @words+' %'
 or address like '%'+@words+'%' or address like '% '+@words+' %'
 or address like @wordcom or address like '% '+@wordcom
 or address like @wordcom+' %' or address like '%'+@wordcom+'%'
 or address like '% '+@wordcom+' %' or address like @wordscom
 or address like '% '+@wordscom or address like @wordscom+' %'
 or address like '% '+@wordscom+' %'

你确实有“喜欢@word +'%'”,所以请注意,如果一条记录与“like @word”匹配,它也会匹配“like @word +'%'”。所以@word不会再添加任何结果。由于“或”,结果将与@word试图匹配的结果相同,或者您只是得到@word +'%'的结果。

应用该逻辑,您可以将查询简化为:

select * from authors
where address like @word+' %' or address like '%'+@word+'%'
 or address like @words+' %' or address like '%'+@words+'%'
 or address like @wordcom+' %' or address like '%'+@wordcom+'%'
 or address like @wordscom+' %' or address like '% '+@wordscom+' %'

同样,@ word不会添加任何'%'+ @ word尚未包含的内容,从而简化了查询:

select * from authors
where address like '%'+@word+'%'
 or address like '%'+@words+'%'
 or address like '%'+@wordcom+'%'
 or address like '% '+@wordscom+' %'

此外,'%'+'%+'s%','%'+ @ word +''''或'%''@ word +'s'%'找到的任何内容都可以通过'%'+ @ word +找到'%'。

答案 5 :(得分:0)

如果你在QUERY中使用LIKE,请使用double %%来包装要过滤的值。 这是最好的解决方案。如果你喜欢这个解决方案,请投票。 例如,在我的情况下,这与主查询

连接在一起
filter_value = "'%%"+filter_value+"%%'"