oracle导入数据之CONCAT和substr

今天还是日常运维,以后如果要将excel导入到数据库里面真的这种人我希望*****

前情提要

导入的数据是由层级关系的,他们的层级关系是通过一个字段path决定的,例如0001的子类就是00010001,然后问题就来了现在我们手里的code值的类型是是660302003004
这是一个四级的菜单,每一级分别是,660302003004
首先可以看得出来这个是一个不规则的所以每一个级别都需要你去单独写sql处理,当然存储过程也可以完成,但是我不会,嗯直接承认。
这个时候我想到了CONCATsubstr然后就是正常java做算法的功能,截取和连接就可以了
这里稍微介绍一个用法吧,具体的网上有的是
CONCAT只能够连接两个字符串
substr截取里面的参数分别是,(字符串,开始位置,长度)
第一级菜单是最简单的,code值就是path。
第二集菜单稍微的用一下

update BFAccountTitle2021 a 
set TREEINFO_PATH=CONCAT(substr(a.code, 0, 4),CONCAT('00',substr(a.code, 5, 6)))
where CHARTOFACC='f80ff706-4f66-45ba-bb0f-639f46712316' 
and TREEINFO_LAYER='2'

这么看这个sql其实没有问题,其实这个里面有一个大坑,后面的where条件是用来限制类型和限制二级菜单的。

问题出现

然后第三级菜单就开始翻车了

select CONCAT(substr('101206001', 0, 4),
                     CONCAT('00', substr('101206001', 5, 6)))
             
from
BFAccountTitle2021    

在这里插入图片描述
忽然就成了这个样子了,我百思不得其解,再三检查也没有问题。

问题处理

后面我去好好的看了看substr的用法,然后才反应过来substr的三个参数的情况,最后一个参数是长度,二级菜单是因为二级菜单的大概是660302,在执行substr(a.code, 5, 6)的时候,从5开始不会有6的长度,但是三级菜单的时候660302003长度远远长于二级菜单的,所以会出现问题
当时我在三级菜单的时候没有反应过来就直接应算出来了,把二级的结果硬生生的截出来处理

update BFAccountTitle2021 a
   set TREEINFO_PATH = CONCAT(substr(CONCAT(substr(a.code, 0, 4),
                     CONCAT('00', substr(a.code, 5, 6))),0,8),CONCAT('0',substr(CONCAT(substr(a.code, 0, 4),
                     CONCAT('00', substr(a.code, 5, 6))),9,10))) 
 where CHARTOFACC = 'f80ff706-4f66-45ba-bb0f-639f46712316'
   and TREEINFO_LAYER = '3'

但是四级的时候我人傻了,找到了问题,然后就稍微简化了我的答案

update BFAccountTitle2021 a
   set TREEINFO_PATH = CONCAT(
  substr(a.code, 0, 4),CONCAT('00',
  CONCAT(substr(a.code, 5, 2),
  CONCAT('0',CONCAT(substr(a.code, 7, 3),CONCAT('0',substr(a.code, 10, 3)))
  )))
  )
 where CHARTOFACC = 'f80ff706-4f66-45ba-bb0f-639f46712316'
   and TREEINFO_LAYER = '4'

真的感觉不同语言类型之间的语法可能会出现差异,千万不要想当然,看好API再用,要不然就会贼难

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又是重名了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值