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

时间:2015-06-23 17:21:22

标签: sql-server sorting

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

Column ID         Value

  1          ff, yy, bb, ii
  2          kk, aa, ee
  3          dd
  4          cc, zz

如果我使用简单查询并按值ASC排序,则会产生列ID的顺序:4,3,1,2,但所需的结果是列ID:2,1,4,3,因为列ID' 2'包含aa,' 1'包含bb,等等。

出于同样的原因,按值DESC排序将产生列ID的顺序:2,1,3,4,但所需的结果是列ID:4,1,2,3。

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

2 个答案:

答案 0 :(得分:2)

最佳解决方案是不要存储单个逗号分隔值。而是有一个详细信息表值,每个ID可以有多个行,每个值都有一个值。

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

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

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.js"></script>
<div ng-app='app'>
  <div ng-controller='ctrl1'>copy 1: {{copy1}}</div>
  <div ng-controller='ctrl2'>copy 2: {{copy2}}</div>
  <div ng-controller='ctrl3'>copy 3: {{copy3}}</div>
</div>

但是这种结构还允许您编写其他更高级的查询。例如,这种结构可以更容易,更有效地检查行是否与特定值匹配,因为您不必每次都解析值列表,并且可以更好地索引单独的值。

答案 1 :(得分:0)

字符串/数组拆分(以及创建,就此而言)被广泛涵盖。您可能希望阅读本文,其中一篇最好的文章涵盖了流行方法的比较。一旦掌握了价值,剩下的就很容易了。

http://sqlperformance.com/2012/07/t-sql-queries/split-strings

有趣的是,我在另一周的交叉应用表函数中做了类似这样的事情来进行一些数据清理,将性能提高了8倍。