Sql server 如何在SQL中对逗号分隔列进行排序

Sql server 如何在SQL中对逗号分隔列进行排序,sql-server,sorting,Sql Server,Sorting,我有一个数据库表,其值列包含逗号分隔的字符串,我需要使用SQL查询对值列进行排序: Column ID Value 1 ff, yy, bb, ii 2 kk, aa, ee 3 dd 4 cc, zz 如果我使用一个简单的查询和order by Value ASC,它将导致列ID的顺序:4、3、1、2,但所需的结果是列ID:2、1、4、3,因为列ID“2”包含aa,“1”包含bb,等等

我有一个数据库表,其值列包含逗号分隔的字符串,我需要使用SQL查询对值列进行排序:

Column ID         Value

  1          ff, yy, bb, ii
  2          kk, aa, ee
  3          dd
  4          cc, zz
如果我使用一个简单的查询和order by Value ASC,它将导致列ID的顺序:4、3、1、2,但所需的结果是列ID:2、1、4、3,因为列ID“2”包含aa,“1”包含bb,等等

同样,order By Value DESC将产生列ID的顺序:2、1、3、4,但所需的结果是列ID:4、1、2、3


我最初的想法是有两个额外的列,“最低值”和“最高值”,在查询中,我可以根据排序顺序对“最低值”和“最高值”进行排序。但我不太确定如何对每行中的最高值和最低值进行排序,并将它们插入适当的列中。或者,在sql语句中是否存在不使用这两个附加列的另一种解决方案?我不太精通sql查询,所以感谢您的帮助。

最好的解决方案是根本不存储单个逗号分隔的值。取而代之的是一个细节表值,每个ID可以有多行,每个ID有一个值

如果您有可能更改数据结构(并且您自己建议添加列,似乎您有),我会选择该解决方案

要按最低值排序,您可以编写一个类似于下面的查询

select
  t.ID
from
  YourTable t
  left join ValueTable v on v.ID = t.ID
group by
  t.ID
order by
  min(v.Value)
但这种结构也允许您编写其他更高级的查询。例如,这种结构使检查一行是否与特定值匹配变得更容易、更有效,因为您不必每次都解析值列表,而且单独的值可以更好地索引。

字符串/数组拆分(以及创建)的内容相当广泛。你可能想读一读这篇文章,这是最好的文章之一,涵盖了流行方法的比较。一旦你有了这些价值观,剩下的就很容易了


有趣的是,就在前几周,我在一个交叉应用的表函数中做了类似的事情,进行了一些数据清理,使性能比现有的循环版本提高了8倍。

糟糕的RDB设计导致了困难的问题。改进您的设计(如@GolezTrol所述…)不幸的是,设计已经完成,我无法更改它。我只是尝试用现有数据生成报告。可能无法更改设计。我本来应该更清楚的。我正在考虑创建一个包含两个附加列的视图,然后在视图中填充附加列。听到这个消息我很难过。一个设计永远不应该是一成不变的,特别是当它是一个糟糕的设计时,但不幸的是,公司通常对此有非常严格的规定。也许你可以看看。它显示了一段(复杂的)SQL来拆分这些值。您可以将该解决方案嵌入到视图中。