背景:
今天遇到单据替换租户,深圳换到惠州,但惠州已经有单据存在,占用了单号。
单号逻辑是日期加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))
函数 | 说明 |
---|---|
CONCAT(s1,s2,...) | 返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL。 |
CONCAT_WS(sx,s1,s2,...) | 返回多个字符串拼接之后的字符串,每个字符串之间拼接上sx。 |
SUBSTRING(s,n,len)、MID(s,n,len) | 两个函数作用相同,从字符串s中返回一个第n个字符开始、长度为len的字符串。 |
LEFT(s,n)、RIGHT(s,n) | 前者返回字符串s从最左边开始的n个字符,后者返回字符串s从最右边开始的n个字符。 |
INSERT(s1,x,len,s2) | 返回字符串s1。将字符串s1从位置x开始,替换掉len个字符,换成字符串s2。 |
REPLACE(s,s1,s2) | 返回一个字符串,用字符串s2替代字符串s中所有的字符串s1。 |
LOCATE(str1,str)、POSITION(str1 IN str)、INSTR(str,str1) | 三个函数作用相同,返回子字符串str1在字符串str中的开始位置(从第几个字符开始)。 |
FIELD(s,s1,s2,...) | 返回第一个与字符串s匹配的字符串的位置。 |
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)-****博客
MySQL字符串的拼接、截取、替换、查找位置_mysql 字符串查找-****博客