【问题标题】:Naturally ORDER a column containing hierarchical item names自然地对包含分层项目名称的列进行排序
【发布时间】:2014-04-11 21:55:11
【问题描述】:

我有一列(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

有人知道怎么做吗?

【问题讨论】:

  • 你已经为 MySQL 和 MS SQL Server 标记了这个。请编辑您的问题以消除其中一个标签,除非您需要两种服务器产品的答案。
  • 我已将我的问题编辑到 tsql

标签: mysql sql sql-server tsql


【解决方案1】:

试试这个

   ORDER BY data, LEN(data) 

或者这个

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

我在 mysql 中进行演示,因为 tsql 在 sqfiddle 中没有。

DEMO

【讨论】:

  • 简短而有效的答案。成功了.. 非常感谢.. +1
【解决方案2】:

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

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

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

我想您希望每个标记(如果它是数字的)都作为数字传递。也就是说,例如,您希望1.123 出现在1.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 项目在NNNth 点右侧的部分。

【讨论】:

  • 非常感谢您的回答。这就是我需要的......很好的答案和解释。 +1
【解决方案3】:

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

从样本中选择数据 ORDER BY CAST ( '/' + replace( data, '.', '/' ) + '/' 作为hierarchyid )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多