我有一个包含特定列的表格,其中有一列包含逗号分隔值,例如 test,exam,result,other 。
我会将 result,sample,unknown,extras 这样的字符串作为参数传递给存储过程。然后我想通过检查此字符串中的每个短语来获取相关记录。
例如:
表A
ID Name Words
1 samson test,exam,result,other
2 john sample,no query
3 smith tester,SE
现在我想搜索结果,样本,未知,附加内容
然后结果应该是
ID Name Words
1 samson test,exam,result,other
2 john sample,no query
因为第一个记录结果匹配,而第二个记录样本匹配。
答案 0 :(得分:7)
你知道,这不是一个很棒的设计。最好将单词分成单独的表(id,word)。
那说,这应该可以解决问题:
set nocount on
declare @words varchar(max) = 'result,sample,unknown,extras'
declare @split table (word varchar(64))
declare @word varchar(64), @start int, @end int, @stop int
-- string split in 8 lines
select @words += ',', @start = 1, @stop = len(@words)+1
while @start < @stop begin
select
@end = charindex(',',@words,@start)
, @word = rtrim(ltrim(substring(@words,@start,@end-@start)))
, @start = @end+1
insert @split values (@word)
end
select * from TableA a
where exists (
select * from @split w
where charindex(','+w.word+',',','+a.words+',') > 0
)
我可以在DBA地狱中为你提供这个!#/ p>
编辑:替换了STUFF w / SUBSTRING切片,在长列表上快了一个数量级。
答案 1 :(得分:1)
就我个人而言,我认为您需要查看您的应用程序/体系结构,并仔细考虑您是否真的想在数据库或应用程序中执行此操作。如果它不合适或不是选项,那么您将需要创建自定义功能。这篇文章中的代码应该很容易修改,以便做你想做的事情:
Quick T-Sql to parse a delimited string(另请参阅评论中的代码)
答案 2 :(得分:0)
就像其他人已经说过的那样 - 你所拥有的是一个糟糕的设计。考虑使用适当的关系来表示这些事情。
话虽如此,这是一篇关于如何使用SQL Server执行此操作的详细文章: http://www.sommarskog.se/arrays-in-sql-2005.html
到目前为止,没有人覆盖过一件事,因为这通常是一个非常糟糕的主意 - 但是,你已经在处理一个坏主意,有时两个错误是正确的 - 是提取所有符合任何行的行您的字符串(使用LIKE或其他类似的东西)并自己做客户端。如果你的字符串相当罕见并且高度相关,那么这可能会很好用;在大多数其他情况下,这将是可怕的。