[英]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 + '%')
如果存在一個空格字符,並且您的搜索字符串位於名為@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.