如何比较两个以逗号分隔值的列值?

时间:2009-10-24 16:06:51

标签: sql-server parsing csv

我有一个包含特定列的表格,其中有一列包含逗号分隔值,例如 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

因为第一个记录结果匹配,而第二个记录样本匹配。

3 个答案:

答案 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或其他类似的东西)并自己做客户端。如果你的字符串相当罕见并且高度相关,那么这可能会很好用;在大多数其他情况下,这将是可怕的。