delimiter //
drop function if exists my_translate_fx //
create function my_translate_fx (p_str varchar(1024), p_ori varchar(1024), p_rep varchar(1024))
-- Replace characters p_ori with corresponding characters p_rep in string p_str
returns varchar(1024)
begin
declare l_ori varchar(1024) default ifnull(p_ori,'') ;
declare l_rep varchar(1024) default ifnull(p_rep,'') ;
declare l_len_ori int unsigned default ifnull(length(p_ori),0) ;
declare l_len_rep int unsigned default ifnull(length(p_rep),0) ;
declare l_res varchar(1024) default p_str ;
declare l_last_rep_chr varchar(6) default '' ;
declare l_pos_ori int unsigned default 1;
-- No change if no original char to replace
if l_len_ori < 1 then
return l_res ;
end if;
-- Replacement string p_rep to be same size as p_ori, when p_rep is not null
-- Complete replacement string repeating the last char in p_rep, eg. ' '
if l_len_rep > 0 then
set l_last_rep_chr := substr( l_rep ,l_len_rep,1) ;
while l_len_rep < l_len_ori do
set l_len_rep := l_len_rep + 1 ;
set l_rep := concat( l_rep, l_last_rep_chr );
end while ;
end if;
while l_pos_ori <= l_len_ori do
set l_res = replace(l_res, substr(l_ori, l_pos_ori, 1), substr(l_rep, l_pos_ori, 1) );
set l_pos_ori = l_pos_ori + 1;
end while;
return l_res ;
end;
//
delimiter ;
select my_translate_fx( '123123','23',' ');
-- select my_translate_fx( '123123','23','xy');
-- select my_translate_fx( '123123','1',' x');
-- select my_translate_fx( '123123','23','');
-- select my_translate_fx( '123123','','z');