我有一个表,其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进行了尝试,但是得到了期望的输出。
答案 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);
答案 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,所以我建议它会有用