2012-06-29 59 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

相關問題