今天还是日常运维,以后如果要将excel导入到数据库里面真的这种人我希望*****
前情提要
导入的数据是由层级关系的,他们的层级关系是通过一个字段path决定的,例如0001的子类就是00010001,然后问题就来了现在我们手里的code值的类型是是660302003004
这是一个四级的菜单,每一级分别是,6603
,02
,003
,004
。
首先可以看得出来这个是一个不规则的所以每一个级别都需要你去单独写sql处理,当然存储过程也可以完成,但是我不会,嗯直接承认。
这个时候我想到了CONCAT
和substr
然后就是正常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再用,要不然就会贼难