2012-06-26 3 views
-1

제품 데이터베이스의 다양한 열에 대해 키워드 목록과 검사 목록을 사용하는 SQL에서 키워드 검색을 만들었습니다. 그래서 제목, 설명 등을 검색 할 수 있습니다.SQL 키워드 결과로 돌아 가기 검색

나는 모든 결과를 반환하고 아무 것도 반환되지 않는 결과를 건너 뛰고 싶습니다.

모든 키워드가 일치 할 때 작동하지만 하나 이상의 키워드가 결과를 반환하지 않을 때 작동합니다. 나는 제로 결과에 대한 검사 또는 제품 테이블에 대한 임시 테이블을 비교하는 더 좋은 방법이 필요하다고 생각하고 있습니다.

아래 예제에서 "braun, washer"를 검색하면 두 가지 결과가 나타납니다. 내가 검색하면 제품의 아무도 단어를 포함하지 않기 때문에

ProductId  ProductName 
23    Large Braun Washer 
45    Small Washer by Braun 

는 그러나, 나는 "브라운, 세탁기, 세척,"어떤 결과를 얻을 수 없다 "세척." 나는 여전히 처음 두 히트에 대한 두 가지 결과를 얻고 싶다.

--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은 매개 변수를 쉼표 분리 문자로 분리 한 후 검색 할 임시 테이블을 작성합니다.

결국 결과의 중요도가 높아 지므로 제목의 결과가 다른 곳보다 많습니다.

+0

나는 전체 텍스트 색인 또는 제 3 자의 검색 플러그인을 사용할 수 없습니다. – User970008

+0

#delimitedKeywords에서 select @Keyword = [keywords]가있는 단일 키워드를 반환합니다 - 'washing'입니다. – user1166147

답변

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

고마워, 그건 속임수 였어. – User970008