如何实现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的数字部分,然后转为数字类型进行排序。
如此排序既能兼顾字符排序规则,也能实现数字排序。
表名 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的数字部分,然后转为数字类型进行排序。
如此排序既能兼顾字符排序规则,也能实现数字排序。
相关文章推荐
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- oracle如何判断字段是数字还是字符
- 关于字符和数字类型的索引,Oracle如何实现内部自动转换以及索引使用的验证测试
- 如何处理ODBC中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- 实现插入新数据字段自增长的触发器(Oracle)
- Oracle中如何用SQL检测字段是否包括中文字符
- Oracle中如何用SQL检测字段是否包括中文字符
- 如何用SQL操作oracle的blob字段里的字符串数据!
- Oracle中如何实现某一字段自动增加1?
- Oracle中如何实现自增字段
- Oracle中如何用SQL检测字段是否包括中文字符
- 如何在oracle中一个字段添加几个字符
- Sql Server 2000,Sql Server 2005以及Oracle下如何实现数据分页
- [求教] - 关于ASP中如何对数据表字段中所包含的特殊字符 ' 与 " 进行转义处理?
- Oracle中如何实现某一字段自动增加1
- 如何用sql语句修改数据表中字段,实现identity(100,1)
- 如何处理Oledb中EXCEL驱动读取EXCEL文件中字段长度大于255字符时出现的"数据截断"问题.
- ORACLE将字符和数字数据分离
- Oracle, SQL Server, My SQL如何实现数据分页查询语句
- 如何使用 PDI 和 Oracle CDC 来实现Oracle 数据库向其他数据库的数据同步