如何对MySQL的varchar值进行排序

时间:2018-08-07 10:36:32

标签: mysql sql sql-order-by

我有一个表,其ID为(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进行了尝试,但是得到了期望的输出。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

以您的示例为例,您可以只使用length()

order by length(id), id

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

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

答案 2 :(得分:0)

Select Convert(Id,UNSIGNED INTEGER) AS num, col1, col2, col3 from Table Order By num 这可以用作Oracle的To_Number,所以我建议它会有用