表定义如下:
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;
答案 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之前出现!)