oracle trim函数与字符串替换的内存实现简单猜测

 

群里讨论问题说,需要将某个字符串例如 "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的语句成反汇编形式,俺恨虚拟码 :(

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值