我们在给含有数字的字符串字段进行排序时,常常会遇到一个尴尬的情况,用简单的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