Mysql 自然地对包含分层项目名称的列进行排序

Mysql 自然地对包含分层项目名称的列进行排序,mysql,sql,sql-server,tsql,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 有人知道怎么做吗?试试这个 ORDER BY data, LEN(data) 还是这个 ORDER

我有一个列(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
有人知道怎么做吗?

试试这个

   ORDER BY data, LEN(data) 
还是这个

 ORDER BY CONVERT(SUBSTRING_INDEX(data, ',', -1), SIGNED), Len(data)
我在mysql中给出了演示,因为tsql不在sqfiddle中

试试这个

   ORDER BY data, LEN(data) 
还是这个

 ORDER BY CONVERT(SUBSTRING_INDEX(data, ',', -1), SIGNED), Len(data)
我在mysql中给出了演示,因为tsql不在sqfiddle中


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

 token [ .token [. token [ .token ]]]
其中,第一个标记之后的后续标记是可选的

我假设您希望每个令牌(如果是数字的话)都作为一个数字传递。例如,您希望
1.123
位于
1.2
之后,因为
123
在数字上大于
2

你没有说你想用字母标记做什么,例如
401.k
403.b
。我想它们应该排在数字标记之后,但按词汇顺序排列

这个查询()将实现五个层次的令牌

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
第四个点右侧的部分。

您似乎希望按自然顺序排列一系列分层命名的项。这些项的名称看起来是这样的

 token [ .token [. token [ .token ]]]
其中,第一个标记之后的后续标记是可选的

我假设您希望每个令牌(如果是数字的话)都作为一个数字传递。例如,您希望
1.123
位于
1.2
之后,因为
123
在数字上大于
2

你没有说你想用字母标记做什么,例如
401.k
403.b
。我想它们应该排在数字标记之后,但按词汇顺序排列

这个查询()将实现五个层次的令牌

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+长度(SUBSTRING_INDEX(col,'.',NNN)))
拾取
NNN
th点右侧的
col
项的一部分。

数据看起来像是分层的。根据提供的当前数据集,如果数据被转换为分层数据,则可以使用类似于:-

按类型从样本订单中选择数据(“/”+replace(数据)”, “/”)+“/”作为层次结构)


数据看起来有点像层次结构。在提供当前数据集的情况下,如果数据转换为层次结构数据,则可以使用以下类似的方法来完成排序:-

按类型从样本订单中选择数据(“/”+replace(数据)”, “/”)+“/”作为层次结构)


您已经为MySQL和MS SQL Server标记了此标记。请编辑您的问题以删除其中一个标记,除非您想要两种服务器产品的答案。我已将我的问题编辑为TSQL您已经为MySQL和MS SQL Server标记了此标记。请编辑您的问题以删除其中一个标记,除非您想要两种服务器产品的答案。i请编辑我的问题,谢谢你的回答。这就是我需要的答案。非常好的回答和解释。+1非常感谢你的回答。这就是我需要的。。非常好的回答和解释。+1简短有效的回答。这就是诀窍。。非常感谢。+1简短有效的回答。这就是诀窍。。谢谢你非常