【发布时间】:2013-01-28 16:13:36
【问题描述】:
我有像A1,A20........A10. 这样的列值,当我进行排序时,这些值显示为A1,A10, A2 等等......
但是,我想以这种格式显示列
A1
A2
A10
A20 and so on..
谁能告诉我如何实现这种排序?
【问题讨论】:
-
所有值都以一个字母开头吗?还是可以有多个?
标签: oracle sorting sql-order-by
我有像A1,A20........A10. 这样的列值,当我进行排序时,这些值显示为A1,A10, A2 等等......
但是,我想以这种格式显示列
A1
A2
A10
A20 and so on..
谁能告诉我如何实现这种排序?
【问题讨论】:
标签: oracle sorting sql-order-by
如果您的列的模式只是 A-Z + 一些数字,您可以使用排序
select id
from your_table
order by regexp_replace(id, '[0-9]', ''),
to_number(regexp_replace(upper(id), '[A-Z]', ''));
regexp_replace(id, '[0-9]', ''),
上面只保留“A”,然后是“B”等。如果你不想这样做,你可以删除它。
但如果任何行有任何其他非数字字符,查询将因无效数字而失败。
例如:
SQL> select * from tester order by id;
ID
-----
A1
A10
A2
A3
A4
A5
A6
A7
A8
A9
B1
B10
B2
B3
B4
B5
B6
B7
B8
B9
20 rows selected.
SQL> select id from tester order by regexp_replace(id, '[0-9]', ''), to_number(regexp_replace(upper(id), '[A-Z]', ''));
ID
-----
A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
B1
B2
B3
B4
B5
B6
B7
B8
B9
B10
【讨论】:
Ask Tom 的另一种方法:
select x from t
order by decode(sign(ascii(substr(lpad(x, 2), 2))-64), 1,
lpad(x, 3, chr(58)),
lpad(x, 2));
【讨论】: