背景:

今天遇到单据替换租户,深圳换到惠州,但惠州已经有单据存在,占用了单号。

单号逻辑是日期加4位数,例如:202401010001。深圳和惠州都有202401010001这条单据,若将深圳的部分单据换到惠州,出现主键重复报错。目前简单的方法是将日期后面的那一位换成9(所幸目前每日单据没有那么多)。

需求:将第9位的0,换成9。

方法:截取前面8位,截取后3位,中间拼个9。

sql:

-- 从第1位开始替换2个字符,换成s
insert('sz202404120001',1,2,'s') -- s202404120001

-- 根据不同的数据库来选择,有的数据库concat可以拼接多个,有的数据库concat只能拼接2个
concat(LEFT('202404120002' ,8),'9',right('202404120002',3))
-- 或者
concat(concat(LEFT('202404120002' ,8),'9'),right('202404120002',3))

substring(s,pos) 和 locate(sx,s)有时候可以搭配一起使用。locate(sx,s)取到sx在s的位置,然后把这个值给到substring,即substring(s1,locate(sx,s)),从第几位开始截取,取到最后一位。

mysql:substr() 取出字符串中的某个特定位置的字符_where substr(dt, 1, 7) = substr(#dt#, 1, 7)-CSDN博客

MySQL字符串的拼接、截取、替换、查找位置_mysql 字符串查找-CSDN博客 

04-16 14:05