如何对 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);
Select Convert(Id,UNSIGNED INTEGER) AS num, col1, col2, col3 from Table
Order By num
这与 Oracle 的 To_Number 一样,所以我认为它会很有用
我有一个 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);
Select Convert(Id,UNSIGNED INTEGER) AS num, col1, col2, col3 from Table
Order By num
这与 Oracle 的 To_Number 一样,所以我认为它会很有用