Oracle 根据字母+数字的字段排序

Oracle 根据字母+数字的字段排序

最近的项目中使用了ztree来编写页面中使用的树形目录,在数据库中存储的时候有一个treeCode字段,形如“root.1.1”,分别代表根节点下第一层目录的第一个节点,新建节点的时候要根据已存在的同级节点的最大treeCode来生成新的treeCode。

遇到的问题

开始测试的时候数据量很少,直接根据treeCode进行降序排序,取到最大的一个字段进行+1操作就可以了,
比如取到最大的值是
”root.1.9“
那么新节点的treeCode就是
“root.1.10”
当到第11个的时候发现新生成的treeCode依旧是"root.1.10"。
原因是数据类型,数据库在排序的时候会将这列按照字符类型进行排序处理。Oracle会按顺序从前到后一位一位的比较两个字符串的值,如果发现到不同的字符,就按照编码进行比较大小。我们的例子中,两个字符串长度不一样,当数据库比较到第八位的时候,9是大一1的,所以”root.1.9“大于"root.1.10"。

解决办法

  1. 在order by 的时候使用函数截取要比较的数字,转换为数值类型进行排序。
 select TREE_CODE from
 		(select TREE_CODE from 
 	 			AUDITOR_NOTES_TREE where TREE_CODE like 'root.1.%' 
 	 			and TREE_CODE not like 'root.1.%.%'  order by CAST(SUBSTR(TREE_CODE,INSTR(TREE_CODE,'.',-1,1)+1) AS INTEGER) desc
 	 			) where ROWNUM = 1;

首先使用INSTR函数获取最后一位”.“的位置,之后根据这个位置使用SUBSTR进行截取,之后使用CAST函数进行类型转换。这样检索到的结果就是我们想要的了。

  1. 在treeCode字段中前补若干个0,使得比较位相对应。
    使"root.1.9"变为”root.001.009“,使”root.1.10“变为”root.001.010“,这样两个字符串比较的位就会按照正常的逻辑按位进行。

你可能感兴趣的:(Oracle,SQL)