2012-06-29 4 views
0

문자열의 순서에 관계없이 문자열 매개 변수에 전달 된 모든 단어가 특정 열에 포함되어있는 모든 행을 검색하려고합니다. 문자열의 모든 단어를 포함하는 행을 반환하십시오.

매개 변수가 'hi abc' 경우

는 내가이 행하고자 : abc def hijk하지 hijk lmnop qr

내가 그것을 어떻게 관리를하지만 난 그게 내가 대안을보고 싶습니다 매우 좋지 않다 생각한다. 어떻게 내 코드 아래에서 더 잘 수행 할 수 있습니까?

create table t (s varchar(200)); 
insert into t (s) values 
('abc def hijk'), 
('hijk lmnop qr'), 
('stu'), 
('v xyz') 
; 

create function dbo.matchRows (@string varchar(max)) 
returns varchar(max) 
begin 

    set @string = replace(@string, '''', ''''''); 
    set @string = replace(@string, ' ', ' '); 
    set @string = replace(@string, ' ', ' '); 
    set @string = replace(@string, ' ', '%'' and s like ''%'); 
    set @string = 's like ''%' + @string + '%'''; 
    set @string = 'select * from t where ' + @string; 
    return @string; 

end; 

declare @query varchar(max); 
set @query = (select dbo.matchRows('hi abc')); 
execute (@query); 

답변

4

이와 비슷한 것이 좋습니다. 검색 매개 변수를 XML로 변환 한 다음 테이블 변수로 분할합니다. 그 후, 당신은 @t 테이블을 검색하여 넘겨받은 모든 분리 된 매개 변수를 찾습니다 (검색된 매개 변수의 개수와 일치하는 발견 된 단어의 수가 그것들 모두와 일치하게됩니다).

DECLARE @SearchStringParams varchar(max), 
    @Split char(1), 
    @Xml xml, 
    @NumOfSearchTerms Int 
DECLARE @SplitTable table (valToSearchFor varchar(100)); 

SELECT @SearchStringParams = 'hi,abc', 
@Split = ',' 

SELECT @Xml = CONVERT(xml,'<root><s>' + REPLACE(@SearchStringParams,@Split,'</s><s>') + '</s></root>') 

INSERT @SplitTable 
SELECT [Value] = T.c.value('.','varchar(20)') 
FROM @Xml.nodes('/root/s') T(c) 

SELECT @NumOfSearchTerms = @@ROWCOUNT 

DECLARE @t table (searchWords varchar(200)); 
insert into @t (searchWords) values 
('abc def hijk'), 
('hijk lmnop qr'), 
('stu'), 
('v xyz') 
; 
select t.searchWords 
from @t t inner join @SplitTable s 
on t.searchWords like ('%' + s.valToSearchFor + '%') 
group by t.searchWords 
having count(t.searchWords) = @NumOfSearchTerms 
+0

+1 신중히 노력하십시오. 하지만 '내부 조인'으로 이어지는 '그룹 가입'을 내 간단한 쿼리보다 낫거나 깔끔하지 않은 것으로 받아들이는 것을 삼가 할 것입니다. 아마도 성능면에서 더 나을 것입니다. XML, IMO를 다루는 것이 문자열 연결만큼 복잡하다는 것은 말할 필요도 없습니다. –

+0

XML에 동의합니다. 다른 방법은 SQL 2008 및 .net (3.5 생각합니다) 저장 프로 시저를 만들고 문자열 대신 테이블 매개 변수를 전달하는 것입니다 사용하는 경우입니다. 그렇게 할 수 있다면 마지막 선택 진술에서 시작할 수 있습니다. 나는 전에 그것들을 망쳐 놓지 않았다. 그러나 그렇게 나쁘지 않아야한다. – CompuChip

관련 문제