2

我有一个搜索框,sql语句如下:

SELECT ..... WHERE ... LIKE '%A%'

但是当用户输入“A B”(A和B之间的空格)

我想选择内容同时包含 A 和 B 的所有记录。

但我不能写:

.... LIKE '%A%B%'

因为它不会匹配 B 首先出现的字符串,例如:“ilikeBnotA”

它应该是

...LIKE '%A%' AND ...LIKE '%B%'

但是用户可能会输入多个空格,例如“ABC ...”,所以我需要编写一个循环,将每个关键字联系到:

AND ...LIKE '%keyword%'

我认为这不是一个好主意,我怀疑它在搜索大字符串(如博客文章内容)时可能会导致性能问题。

这个问题有什么好的解决办法吗?搜索引擎是这样做的吗?

4

4 回答 4

3

首先,您需要一个拆分功能:

CREATE function [dbo].[f_split]
(
@param nvarchar(max), 
@delimiter char(1)
)
returns @t table (val nvarchar(max), seq int)
as
begin
set @param += @delimiter

;with a as
(
select cast(1 as bigint) f, charindex(@delimiter, @param) t, 1 seq
union all
select t + 1, charindex(@delimiter, @param, t + 1), seq + 1
from a
where charindex(@delimiter, @param, t + 1) > 0
)
insert @t
select substring(@param, f, t - f), seq from a
option (maxrecursion 0)
return
end

然后你可以像这样搜索:

-- declaring a tablevariable to represent your table
declare @yourtable table(id int identity(1,1), searchcol varchar(50))
insert @yourtable values('abc')
insert @yourtable values('za')
insert @yourtable values('az')
insert @yourtable values('zz')
declare @input varchar(50)
set @input = 'a b c'

-- show if one or more match exists
select * from @yourtable a 
where exists (select 1 from f_split(@input, ' ') b 
              where a.searchcol like '%'+ b.val + '%')


--show only if all matches exists
select * from @yourtable a 
where not exists (select 1 from clausens_base.dbo.f_split(@input, ' ') b 
              where not a.searchcol like '%'+ b.val + '%')
于 2012-07-30T14:44:59.310 回答
1

您可以在 SQL中使用正则表达式并编写一个正则表达式匹配所有给定的字符串

(?=.*one)(?=.*two)(?=.*three)
于 2012-07-30T14:14:40.137 回答
0

如果存在一个空格字符并且您的搜索字符串位于名为@a 的变量中,则下面的编写代码应该这样做

     ...LIKE LEFT(@a,CHARINDEX(' ',@a)) AND ... LIKE RIGHT(@a,CHARINDEX(' ',@a))
于 2012-07-30T13:59:02.013 回答
0

在表中创建另一列,例如关键字,在插入数据时还可以通过删除空格字符并插入到该列来创建数据的关键字。搜索时搜索此列中的关键字。

create function createKeyword(@data nvarchar(256))
returns nvarchar(256)
as
begin
-- remove whitespace characters
return @kword
end

并且在搜索使用时

t.keywords like '%' + dbo.createKeyword(@data) + '%' 
于 2012-07-30T14:13:50.350 回答