2

検索ボックスを取得しました。SQLステートメントは次のようになります。

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

ただし、ユーザーが「A B」(AとBの間のスペース)を入力した場合

コンテンツにAとBの両方が含まれているすべてのレコードを選択したい。

しかし、私は書くことができません:

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

「ilikeBnotA」のようにBが最初に出現する文字列とは一致しないため

そのはず

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

しかし、ユーザーは「ABC ...」のように複数のspanceを入力する可能性があるため、ループを記述して、すべてのキーワードを次の場所に接続する必要があります。

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

スペースcharが1つあり、検索文字列が@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 に答える