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"。
解决办法
- 在order by 的时候使用函数截取要比较的数字,转换为数值类型进行排序。
select TREE_CODE from
(select TREE_CODE