0

特定の列に、文字列パラメーターで渡されたすべての単語が表示される順序に関係なく含まれているすべての行を取得したいと考えています。

パラメータが次の場合、'hi abc'この行が必要ですabc def hijkhijk 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

1 に答える 1

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
于 2012-06-29T18:58:01.157 に答える