簡體   English   中英

如何處理搜索關鍵字中的空間? 我想通過AND匹配結果

[英]How to deal space in search keywords? i want to match results by AND

我有一個搜索框,sql語句如下:

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

但是當用戶輸入“ AB”(A和B之間的空格)時

我想選擇內容同時包含A和B的所有記錄。

但是我不能寫:

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

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

它應該是

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

但是用戶可能輸入了不止一個空格,例如“ ABC ...”,因此我需要編寫一個循環,將每個關鍵字都連接到:

AND ...LIKE '%keyword%'

我認為這不是一個好主意,我懷疑它在搜索大字符串(例如博客文章內容)時可能會導致性能問題。

有什么好的解決辦法嗎? 陶氏搜索引擎做到了嗎?

首先,您需要一個split函數:

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 + '%')

可以 在SQL中 使用正則表達式並編寫正則表達式匹配所有給定的字符串

(?=.*one)(?=.*two)(?=.*three)

如果存在一個空格字符,並且您的搜索字符串位於名為@a的變量中,則應執行以下編寫的代碼

     ...LIKE LEFT(@a,CHARINDEX(' ',@a)) AND ... LIKE RIGHT(@a,CHARINDEX(' ',@a))

在表中創建另一個列,例如關鍵字,並且在插入數據時,還可以通過刪除空格字符並插入到此列來創建數據的關鍵字。 搜索時,在此列中搜索關鍵字。

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

當搜索使用時

t.keywords like '%' + dbo.createKeyword(@data) + '%' 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM