群里讨论问题说,需要将某个字符串例如 "0100100100000” 转换成"0122122100000"的形式,也就是首尾的0不变,中间的0换成2。
有大牛思路为第一个1到最后一个1之间的0直接replace,如下:
SELECT
SUBSTR('0100100100000',1,INSTR('0100100100000', '1', 1, 1))||
REPLACE(SUBSTR('0100100100000',INSTR('0100100100000', '1', 1, 1)-1,INSTR('0100100100000', '1', -1, 1)-INSTR('0100100100000', '1', 1, 1)),'0','2')
|| SUBSTR('0100100100000',INSTR('0100100100000', '1', -1, 1))
FROM DUAL;
我的是思路是先去掉首尾的0,replace后再和原来的字符串进行替换,这样可以保持更好的通用性,当然效率比较低。ltrim和rtrim的实现方法如下:
select
replace(
'0100100100000',
rtrim(ltrim('0100100100000','0'),'0'),
replace(rtrim(ltrim('0100100100000','0'),'0'),'0','2'))
from dual;
在查文档时发现trim的参数trim_character【单个字符替换,前或者后】也可以完成,只能感慨自己基础不牢,有空得好好看完书了,好比当初学破解一样,当你API都不了解清楚的时候,别人编程到底会怎么写,自己心里是没底的,这样的破解肯定事倍功半。
在内存中,模拟一个字符串"010",现在需要把1替换为2,那么过程不外乎为:
1,
假设 有[50001111]="010"
拆散成 ASCII [UNICODE] 得到:
40000001 30
40000002 31
40000003 30
2,循环字符串长度(3)次,开始比较,当前字符值是否和待替换的字符一致,是则替换掉,不是则继续下一个字符的判断
3,替换完成,组合成新字串
以上全部是猜测,仅此记录。至于更高级的trim,ltrim等方式,则是该替换方式的高级封装罢了。
另不知道如何动态调试ORACLE的语句成反汇编形式,俺恨虚拟码 :(