oracle数据库实现按照截取某个字段的部分进行排序

1.正常情况下我们排序都会按照某一列直接order by xxx,我的需求是按照某一列的部分进行排序,正常排序如下

2.如图所示我查出来的字段为string型且固定为6位,我想按照这六位的前两位和后三位进行升序排列,即忽略第三位的存在,目前查出来的是按照整体排的序,修改如下:

使用substr函数截取字符中的所需位数进行排序即可,如果排序的条件是多列一直往后追加即可,会按照在上一个条件的前提下对下一个条件排序

substr函数说明,substr(string string1,int a,int b)

第一个参数为要截取的的字符串,第二个参数为开始位置,第三个参数为截取后的长度

若第一个参数为负数则会从有向左截取,0或1表示自左向右第一位开始截取,大于1从指定为置开始截取,如下:

(1)select substr('1234567',0,3) value from dual;//返回结果 123

(2)select substr('1234567',1,3) value from dual;//返回结果 123

(3)select substr('1234567',2,3) value from dual;//返回结果 234

(4)select substr('1234567',-1,3) value from dual;//返回结果 7

(5)select substr('1234567',-2,3) value from dual;//返回结果 67

(6)select substr('1234567',-3,3) value from dual;//返回结果 567

(7)select substr('1234567',-4,3) value from dual;//返回结果 456

说明:虽然(6),(7)截取的都是3个字符,结果却不是3 个字符; 因为只要 |a| ≤ b,取a的个数(如:(4),(5));当 |a| ≥ b时,才取b的个数,由a决定截取位

3.另外如果你把代码写到mapping的xml文件里会报错,不识别substr,这是因为xml文件不支持这个字符关键字,需要修改为如下

 ORDER BY
	<![CDATA[ substr ]]>( t1.EXAM_NO, 0, 2 ) ASC,
	<![CDATA[ substr ]]>( t1.EXAM_NO,- 3, 3) ASC

加上<![CDATA[  ]]>将其转义即可,<![CDATA[  ]]>标签的用法可以看我的另外一篇博客有介绍

发布了9 篇原创文章 · 获赞 0 · 访问量 417

猜你喜欢

转载自blog.csdn.net/XiaoBo_S/article/details/103462728
今日推荐