我们在给含有数字的字符串字段进行排序时,常常会遇到一个尴尬的情况,用简单的order by无法给这些字段完整的排序,如以下查询效果,不符合我们的预期:
select * from tb1 order by name;

怎么办呢?用正则表达式可以解决这个问题,下面给个完整例子:
创建测试表
create table tb1(name varchar2(50), val number);
insert into tb1 values('rec7', 100);
insert into tb1 values('rec8', 100);
insert into tb1 values('rec3', 100);
insert into tb1 values('rec5', 100);
insert into tb1 values('rec2', 100);
insert into tb1 values('rec9', 100);
insert into tb1 values('rec10', 100);
insert into tb1 values('rec4', 100);
insert into tb1 values('', 100);
insert into tb1 values('rec6', 100);
insert into tb1 values('rec1', 100);
commit;
按照第一个字段排序输出
select * from tb1 order by to_number(regexp_substr(name, '[0-9]*[0-9]', 1))

也可以用以下形式,效果是一样的
select * from tb1 order by to_number(translate(name, '0123456789.' || name, '0123456789.')) asc nulls last
当需要对含有数字的字符串字段进行正确排序时,普通的orderby无法达到预期效果。本文提供了一个解决方案,通过使用正则表达式和TO_NUMBER函数,或者TRANSLATE函数,可以将含有数字的字符串转换为数字进行排序,确保排序的准确性。例如,可以使用`SELECT * FROM tb1 ORDER BY TO_NUMBER(REGEXP_SUBSTR(name, '[0-9]*[0-9]', 1))`或`SELECT * FROM tb1 ORDER BY TO_NUMBER(TRANSLATE(name, '0123456789.'||name, '0123456789.')) ASC NULLS LAST`来实现正确的排序。
2513

被折叠的 条评论
为什么被折叠?



