如何实现oracle字段中字符+数字的数据------兼顾字符和数字组合排序

背景:目前在一个项目中遇到一个排序的问题,不同的厂商编号不一样。

表名 T_PART_INFO

如果A厂商的图中编号img_in_code字段信息如下

------------------------------------------------------------------------------------------

img_in_code 图号编号(字符类型)

------------------------------------------------------------------------------------------

A10

------------------------------------------------------------------------------------------

A11

------------------------------------------------------------------------------------------

A12

------------------------------------------------------------------------------------------

A14

------------------------------------------------------------------------------------------

A13

------------------------------------------------------------------------------------------

B11

------------------------------------------------------------------------------------------

B12

------------------------------------------------------------------------------------------

C11

------------------------------------------------------------------------------------------

C12

------------------------------------------------------------------------------------------

如果B厂商的图中编号如下

------------------------------------------------------------------------------------------

img_in_code 图号编号(字符类型)

------------------------------------------------------------------------------------------

0

------------------------------------------------------------------------------------------

1

------------------------------------------------------------------------------------------

2

------------------------------------------------------------------------------------------

4

------------------------------------------------------------------------------------------

3

------------------------------------------------------------------------------------------

5

------------------------------------------------------------------------------------------

7

------------------------------------------------------------------------------------------

8

------------------------------------------------------------------------------------------

9

------------------------------------------------------------------------------------------

10

------------------------------------------------------------------------------------------

11

------------------------------------------------------------------------------------------

12

------------------------------------------------------------------------------------------

20

------------------------------------------------------------------------------------------

21

------------------------------------------------------------------------------------------

22

------------------------------------------------------------------------------------------



如果按常规写法

select img_in_code from T_PART_INFO order by img_in_code 

------------------------------------------------------------------------------------------

A厂商的显示结果正常,但是B厂商的排序如下

------------------------------------------------------------------------------------------

0

------------------------------------------------------------------------------------------

1

------------------------------------------------------------------------------------------

10

------------------------------------------------------------------------------------------

11

------------------------------------------------------------------------------------------

12

------------------------------------------------------------------------------------------

2

------------------------------------------------------------------------------------------

20

------------------------------------------------------------------------------------------

21

------------------------------------------------------------------------------------------

22

------------------------------------------------------------------------------------------

4

------------------------------------------------------------------------------------------

3

------------------------------------------------------------------------------------------

5

------------------------------------------------------------------------------------------

7

------------------------------------------------------------------------------------------

8

------------------------------------------------------------------------------------------

9

------------------------------------------------------------------------------------------

最好是兼顾字符排序优先,在按数字排序。使用正则匹配字符和数字分别进行排序处理;

select  img_in_code 

 from   T_PART_INFO 

order by regexp_substr(img_in_code,'[^0-9]+'),to_number(regexp_substr(img_in_code,'[0-9]+')).

-----------------------------------------------------------------------------------------------------------------------------------------

使用排序函数说明:
1.regexp_substr延伸substr函数的功能,让你搜索一个正则表达式模式字符串;

语法

Oracle数据库中的regexp_substr函数的语法是:

regexp_substr(source_char, pattern [, position [, occurrence [, match_parameter ]]]);
参数说明
参数1:source_char 搜索字符串。可以是任意的数据类型char,VARCHAR2,nchar,CLOB,NCLOB类型;
参数2:pattern 正则表达式;
参数3:position
可选。搜索在字符串中的开始位置。如果省略,默认为1,这是第一个位置的字符串。
参数4:occurrence
可选。它是模式字符串中的第n个匹配位置。如果省略,默认为1。
参数5:match_parameter
可选。它允许你修改regexp_substr功能匹配的行为。

2.to_number()

转换字符为数字类型,里面必须是数字或者null,不然会提示无效数字错误。

-----------------------------------------------------------------------------------
示例中的排序说明:
regexp_substr(img_in_code,'[^0-9]+')取img_in_code的字符部分;
to_number(regexp_substr(img_in_code,'[0-9]+'));
先用正则取img_in_code的数字部分,然后转为数字类型进行排序。
如此排序既能兼顾字符排序规则,也能实现数字排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值