如何通过降序整数值对此表进行排序?

时间:2017-01-19 04:31:14

标签: sql oracle

表定义如下:

create table test_1
( match_id varchar2(30), ts timestamp );

match_id的格式为整数。[A | B],例如1.A,1.B,99.A或99.B.在同一整数上具有match_id的行称为一对,因此1.A和1.B是一对,而99.A和99.B是另一对。数据库是Oracle 11.2或更高版本。

SQL> insert into test_1 values ('1.A',current_timestamp);
SQL> insert into test_1 values ('1.B',current_timestamp-10);
SQL> insert into test_1 values ('100.A',current_timestamp-20);
SQL> insert into test_1 values ('100.B',current_timestamp-30);
SQL> insert into test_1 values ('99.A',current_timestamp-40);
SQL> insert into test_1 values ('99.B',current_timestamp-50);

我想在match_id列中按整数值的降序选择此表,例如100.B,100.A,99.B,99.A,1.B,1.A但是后面的语句返回99 .B,99.A,100.B,100.A,1.B,1.A。请建议。

SQL> select * from test_1 order by match_id desc;

2 个答案:

答案 0 :(得分:2)

尝试;

Select  * 
from test_1
order by TO_NUMBER(SUBSTR(match_id, 1, LENGTH(match_id) - 2)) desc;

这里假设除了最后两个字符外,其他字符构成有效数字。

或使用REGEXP_SUBSTR

Select  * 
from test_1
order by TO_NUMBER(REGEXP_SUBSTR(match_id,'^[0-9]+')) desc

这只需要从开头的数字

答案 1 :(得分:0)

这是一个更简单的想法,如果你有一个输入字符串的长度(字符数)的界限,你可以在不检查数据的情况下知道。

...order by lpad(match_id, 20, '0') desc    --  assuming all the strings are length <= 20

那就是:将所有东西视为字符串。如果需要,通过在左侧添加零来使它们具有相同的长度。然后按字母顺序排序(包括句点和字母A或B)与排序数字部分相同,然后排序A和B - 所有这些都是降序。 (请注意,仅通过数字部分排序并不能保证B将在A之前出现!)