キーワードのリストを取得し、製品データベースのさまざまな列をチェックするキーワード検索を SQL で作成しました。そのため、タイトル、説明などを検索できます。
すべての結果を返し、何も返されない結果をスキップしたいと思います。
すべてのキーワードが一致する場合は機能しますが、1 つ以上のキーワードが結果を返さない場合は機能しません。結果がゼロかどうかを確認するか、一時テーブルと製品テーブルを一致させるためのより良い方法が必要だと考えています。
以下の例では、「braun,washer」を検索すると、2 つの結果が得られます。
ProductId ProductName
23 Large Braun Washer
45 Small Washer by Braun
ただし、「braun,washer,washing」を検索しても、「washing」という単語が含まれている製品がないため、結果が得られません。最初の 2 つのヒットの 2 つの結果を取得したいと考えています。
--temp table for keyword values
create table #delimitedKeywords
(
[keywordID] int identity(1,1),
keywords varchar(100)
)
declare @keywordValues varchar(50);
declare @arrayLength int;
declare @position int;
declare @nextDelim int;
declare @prevDelim int;
declare @delimValue varchar(10);
set @keywordValues = 'braun,washer,washing,';
set @arrayLength = LEN(@keywordValues);
set @position = 1;
set @nextDelim = 0;
set @prevDelim = 0;
--loop through position
while @position <= @arrayLength
begin
--substring comma delimeter
set @nextDelim = CHARINDEX(',', @keywordValues, @position);
set @delimValue = (SUBSTRING(@keywordValues, @position, @nextDelim - @prevDelim -1));
--stop loop if at end
if LEN(@delimValue) > 0
BEGIN
insert into #delimitedKeywords
(keywords)
values
(@delimValue);
END
set @prevDelim = @nextDelim;
set @position= @nextDelim+1;
end
begin
--select the keywords from the temp table to search on
declare @Keyword varchar(100)
select @Keyword = [keywords] from #delimitedKeywords
--search product table
SELECT [ProductId]
,[ProductName]
,[ProductDescription]
,[ProductBrief]
,[ProductSpecification]
FROM [Product]
WHERE
[ProductName] like '%' + @Keyword + '%'
OR [ProductDescription] like '%' + @Keyword + '%'
OR [ProductSpecification] like '%' + @Keyword + '%'
OR [ProductBrief] like '%' + @Keyword + '%'
--drop temp
drop table #delimitedKeywords;
end
クライアントは、単一の SQL パラメータを MS SQL のストアド プロシージャに渡します。次に、SQL はパラメーターをコンマ区切り記号で分割し、検索対象の一時テーブルを作成します。
最終的には、結果に重みを付けて、タイトルからの結果が他の場所よりも多くなるようにする予定です。