如何按整数值降序对该表进行排序?

Posted

技术标签:

【中文标题】如何按整数值降序对该表进行排序?【英文标题】:How to sort this table by descending integer value? 【发布时间】:2017-01-19 04:31:14 【问题描述】:

表定义是这样的:

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;

【问题讨论】:

【参考方案1】:

试试;

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

这将只取开头的数字

【讨论】:

【参考方案2】:

这是一个更简单的想法,如果您对输入字符串的长度(字符数)有一个限制,您无需检查数据就知道。

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

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

【讨论】:

以上是关于如何按整数值降序对该表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何按升序和降序对列进行排序?

如何按降序对 ListView.builder 进行排序?

如何在Ruby中按降序对数组进行排序

如何按日期降序对数据表进行排序

如何在 Reactjs 中按升序或降序对数据进行排序?

如何按整数值对哈希图进行排序[重复]