自然地对包含分层项名称的列进行ORDER

时间:2014-03-08 17:04:15

标签: mysql sql sql-server tsql

我有一个(VARCHAR类型的)列,其值如下:

1
2
3
1.1
1.1.1
1.2.1
5
4
7
8
9
10
10.2
10.1

我跳[e选择此栏并自然订购,如下所示:

1
1.1
1.1.1
1.2.1
2
3
4
5
...

我尝试过这个,例如和其他很多查询

SELECT data 
FROM sample 
ORDER BY LEN(data), data

有人知道如何做到这一点吗?

3 个答案:

答案 0 :(得分:2)

试试这个

   ORDER BY data, LEN(data) 

或者

 ORDER BY CONVERT(SUBSTRING_INDEX(data, ',', -1), SIGNED), Len(data)

我在mysql中提供demo,因为tsql没有sqfiddle。

DEMO

答案 1 :(得分:1)

您似乎希望按自然顺序订购一系列分层命名的项目。看起来这些项目的名称采用的形式。

 token [ .token [. token [ .token ]]]

其中第一个后续标记是可选的。

我想你希望每个令牌(如果它是数字)作为数字递送。也就是说,例如,您希望1.1231.2之后,因为123在数字上大于2

你没有说出你想要用字母标记做什么,例如401.k403.b。我想他们应该在数字之后,但是按照词汇顺序。

此查询(http://sqlfiddle.com/#!2/81756/2/0)可以解决五个级别的令牌问题。

SELECT col
  FROM T 
 ORDER BY
       FLOOR(SUBSTRING_INDEX(col,'.',1)),
       SUBSTRING_INDEX(col,'.',1),

       FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',1)))),
       SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',1))),

       FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',2)))),
       SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',2))),

       FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',3)))),
       SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',3))),

       FLOOR(SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',4)))),
       SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',4)))

为什么这样做? FLOOR()将字符串的最左边部分转换为整数,因此它会获取前导整数。如果它没有在它试图转换的字符串中找到任何数字,则返回零。

并且SUBSTRING(col, 2+LENGTH(SUBSTRING_INDEX(col,'.',NNN)))选取col点右侧NNN项的部分。

答案 2 :(得分:1)

数据看起来像Hierarchical。使用当前提供的数据集,如果数据转换为分层数据,则可以使用类似于以下内容的方式完成订单: -

  

SELECT FROM FROM FROM ORDER BY CAST('/'+ replace(data,'。',   '/')+'/'as hierarchyid)