SQL关键字搜索返回任何结果

时间:2012-06-26 17:42:42

标签: sql search loops keyword temp-tables

我在SQL中创建了一个关键字搜索,它采用关键字列表并检查产品数据库中的各个列。所以你可以搜索标题,描述等。

我希望它返回所有结果并跳过没有返回任何内容的结果。

当所有关键字都匹配时,它会起作用,但当一个或多个关键字未返回任何结果时,它不起作用。我认为需要检查零结果或更好的方法来匹配临时表和产品表。

在下面的示例中,如果我搜索“braun,washer”,我会得到两个结果。

ProductId      ProductName
23             Large Braun Washer
45             Small Washer by Braun

然而,如果我搜索“braun,washer,washing”,我就没有结果,因为没有一个产品包含“洗涤”这个词。我仍然希望获得前两次点击的两个结果。

--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然后在逗号分隔符上拆分参数,然后创建一个要搜索的临时表。

最终我计划对结果进行加权,因此标题的结果比其他地方的结果更多。

1 个答案:

答案 0 :(得分:0)

这不会返回单个值:

select @Keyword =  [keywords] from #delimitedKeywords

......也许是这样的:

SELECT DISTINCT [ProductId]
  ,[ProductName]
  ,[ProductDescription]
  ,[ProductBrief]
  ,[ProductSpecification]
FROM [Product]
INNER JOIN #delimitedKeywords
ON [ProductName] like '%' + Keywords + '%'
OR [ProductDescription] like '%' + Keywords + '%'
OR [ProductSpecification] like '%' + Keywords + '%'
OR [ProductBrief] like '%' + Keywords + '%'