您的位置:首页 > 数据库 > Oracle

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

2016-12-23 11:53 495 查看
背景:目前在一个项目中遇到一个排序的问题,不同的厂商编号不一样。

表名 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的数字部分,然后转为数字类型进行排序。

如此排序既能兼顾字符排序规则,也能实现数字排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息