select concat( left(id,length(id)-SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)), case when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=3 then SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2) when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=2 then concat('0',SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)) when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=1 then concat('00',SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)) end) from test21;
update table1 set id=LPAD(SUBSTRING_INDEX(id,'_',-1),3,'0'); 这个语句的问题是:一旦你的ID的尾数为12345,只会取前3个数字123。
select case when length(substring_index(id,'_',-1))=1 then concat(substring_index(id,'_',3),'_00',substring_index(id,'_',-1)) when length(substring_index(id,'_',-1))=2 then concat(substring_index(id,'_',3),'_0',substring_index(id,'_',-1)) else id end as id;
我一直找不到倒着查找的函数,原来是 substring_index
set @a := "0_1013377_161_1"; set @b := "0_1013377_161_12"; set @c := "0_1013377_161_123";select @a as 原数据, concat(SUBSTRING_INDEX(@a, '_', 3), '_', LPAD(SUBSTRING_INDEX(@a, '_',-1),3,'0' )) as 处理后数据 union select @b, concat(SUBSTRING_INDEX(@b, '_', 3), '_', LPAD(SUBSTRING_INDEX(@b, '_',-1),3,'0' )) union select @c, concat(SUBSTRING_INDEX(@c, '_', 3), '_', LPAD(SUBSTRING_INDEX(@c, '_',-1),3,'0' ));+-------------------+-------------------+ | 原数据 | 处理后数据 | +-------------------+-------------------+ | 0_1013377_161_1 | 0_1013377_161_001 | | 0_1013377_161_12 | 0_1013377_161_012 | | 0_1013377_161_123 | 0_1013377_161_123 | +-------------------+-------------------+实际操作,如下即可: update 表 set id = concat(SUBSTRING_INDEX(id, '_', 3), '_', LPAD(SUBSTRING_INDEX(id, '_',-1),3,'0' ));
concat(
left(id,length(id)-SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)),
case when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=3 then SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)
when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=2 then concat('0',SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))
when LENGTH(SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2))=1 then concat('00',SUBSTR(id,CHAR_LENGTH(id)-instr(REVERSE(id),'_')+2)) end) from test21;
这个语句的问题是:一旦你的ID的尾数为12345,只会取前3个数字123。
case
when length(substring_index(id,'_',-1))=1
then
concat(substring_index(id,'_',3),'_00',substring_index(id,'_',-1))
when length(substring_index(id,'_',-1))=2
then
concat(substring_index(id,'_',3),'_0',substring_index(id,'_',-1))
else
id
end
as id;
set @b := "0_1013377_161_12";
set @c := "0_1013377_161_123";select @a as 原数据, concat(SUBSTRING_INDEX(@a, '_', 3), '_', LPAD(SUBSTRING_INDEX(@a, '_',-1),3,'0' )) as 处理后数据
union
select @b, concat(SUBSTRING_INDEX(@b, '_', 3), '_', LPAD(SUBSTRING_INDEX(@b, '_',-1),3,'0' ))
union
select @c, concat(SUBSTRING_INDEX(@c, '_', 3), '_', LPAD(SUBSTRING_INDEX(@c, '_',-1),3,'0' ));+-------------------+-------------------+
| 原数据 | 处理后数据 |
+-------------------+-------------------+
| 0_1013377_161_1 | 0_1013377_161_001 |
| 0_1013377_161_12 | 0_1013377_161_012 |
| 0_1013377_161_123 | 0_1013377_161_123 |
+-------------------+-------------------+实际操作,如下即可:
update 表 set id = concat(SUBSTRING_INDEX(id, '_', 3), '_', LPAD(SUBSTRING_INDEX(id, '_',-1),3,'0' ));