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

在Oracle数据库中,对包含字母和数字的字段进行排序时,由于默认的字符排序规则导致错误的顺序。例如,"root.1.9"大于"root.1.10"。解决方案是在ORDER BY子句中使用INSTR、SUBSTR和CAST函数,截取数字部分并转换为数值类型进行排序。此外,可通过在数字部分前补0确保位数一致,以正确进行按位比较。
摘要由CSDN通过智能技术生成

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值