如何对 varchar 值进行排序 MySQL

How to sort varchar values MySQL

我有一个 table,它的 id's(varchar) 为

-----------------------------------------
ID        |NAME    |COLUMN1  |COLUMN2   |
-----------------------------------------
11.10     |abcd    |New col  | new col  |
11.10(a)  |abcd    |New col  | New Col 2|
11.50     |abcd    |New COl  | New coli | 
11.50(a1) |abcd    |New col  | New Col 2|
11.50(a2) |abcd    |New col  | New Col 2|
11.300(a) |abcd    |New col  | New Col 2|
11.200(a) |abcd    |New col  | New Col 2|
11.100(a) |abcd    |New col  | New Col 2|
11.40(a)  |abcd    |New col  | New Col 2|

现在,如果我使用以下方式获取排序数据:

Select * from table order by length(id) asc,id;

我得到的结果像

11.10
11.50
11.10(a)
11.100(a)
11.200(a)
11.300(a)
11.40(a)
11.50(a)
11.50(a1)

但我想要的输出是

11.10
11.10(a)
11.40(a)
11.50
11.50(a)
11.50(a2)
11.200(a)
11.300(a)

相同的适当查询是什么?我已经使用 CAST 进行了尝试,但得到了所需的输出。

对于您的示例,您可以只使用 length():

order by length(id), id

一种稍微更通用的方法使用 substring_index() 和隐式转换:

order by substring_index(id, '.', 1) + 0,
         substring_index(id, '.', -1) + 0,
         id

您想要的查询可能是这个:

select ID           
  from Table_
 order by cast( SUBSTRING_INDEX(SUBSTRING_INDEX(id, '.',-1), '(', 1) as signed ),
                SUBSTRING_INDEX(SUBSTRING_INDEX(id, '(',-1), ')', 1);

SQL Fiddle Demo

Select Convert(Id,UNSIGNED INTEGER) AS num, col1, col2, col3 from Table Order By num 这与 Oracle 的 To_Number 一样,所以我认为它会很有用