背景:目前在一个项目中遇到一个排序的问题,不同的厂商编号不一样。
表名 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的数字部分,然后转为数字类型进行排序。
如此排序既能兼顾字符排序规则,也能实现数字排序。