我有一个(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
有人知道如何做到这一点吗?
答案 0 :(得分:2)
试试这个
ORDER BY data, LEN(data)
或者
ORDER BY CONVERT(SUBSTRING_INDEX(data, ',', -1), SIGNED), Len(data)
我在mysql中提供demo,因为tsql没有sqfiddle。
答案 1 :(得分:1)
您似乎希望按自然顺序订购一系列分层命名的项目。看起来这些项目的名称采用的形式。
token [ .token [. token [ .token ]]]
其中第一个后续标记是可选的。
我想你希望每个令牌(如果它是数字)作为数字递送。也就是说,例如,您希望1.123
在1.2
之后,因为123
在数字上大于2
。
你没有说出你想要用字母标记做什么,例如401.k
和403.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)