【问题标题】:How to compare two column values which are comma separated values?如何比较两个逗号分隔值的列值?
【发布时间】:2010-12-09 18:09:42
【问题描述】:

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

现在我想搜索result,sample,unknown,extras

那么结果应该是

ID        Name                Words
1         samson              test,exam,result,other
2         john                sample,no query

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

【问题讨论】:

  • 你用什么sql引擎?
  • 我会考虑修复我的数据库设计。
  • 您如何要求将“测试、考试、结果、其他”作为结果集的人?这是一个次优设计。

标签: sql-server parsing csv


【解决方案1】:

这不是一个伟大的设计,你知道的。最好将 Words 拆分为单独的表(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 地狱中燃烧!

编辑:用 SUBSTRING 切片替换 STUFF,在长列表上快一个数量级。

【讨论】:

  • 想想篝火下的火炬,彼得...:D
  • 嘿。我认为你发布这个很好——很好地说明了为什么不应该这样设计东西。
  • 我同意设计可以正确完成,但不幸的是,我们中的一些人可能会被这些问题所困扰,并且没有能够改变某人糟糕设计的奢侈。谢谢你张贴这个! :)
【解决方案2】:

就像其他人已经说过的那样——你所拥有的是一个糟糕的设计。考虑使用适当的关系来表示这些东西。

话虽如此,这里有一篇关于如何使用 SQL Server 执行此操作的详细文章: http://www.sommarskog.se/arrays-in-sql-2005.html

到目前为止还没有人介绍过的一件事,因为它通常是一个非常糟糕的主意 - 但是,您已经在使用一个糟糕的主意,有时两个错误就是一个正确 - 是提取与 ANY 匹配的所有行您的字符串(使用 LIKE 或类似的)并在客户端自己进行交集。如果您的字符串相当罕见且高度相关,那么这可能会很好;在大多数其他情况下,这将是可怕的。

【讨论】:

    【解决方案3】:

    我个人认为您应该查看您的应用程序/架构,并仔细考虑您是否真的想在数据库或应用程序中执行此操作。如果它不合适或不是一个选项,那么您需要创建一个自定义函数。此处文章中的代码应该很容易修改以执行您想要的操作:

    Quick T-Sql to parse a delimited string(也可以看看cmets中的代码)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-02
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多