这样的sql,我却做到了。

 这是一个CSDN Oracle开发版块里,网友问过的一道题

 

题如下

create table A_TEST
(
PAYOUT_ITEM_CODE VARCHAR2(30) not null,
FORMULA_DET VARCHAR2(1000)
)

create table B_TEST
(
ELEMENT_ID VARCHAR2(5) not null,
NAME VARCHAR2(41)
)  

 

求写oracle多个字符替换(有测试数据)

 

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30228', '({30015}+{30016})*450');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*1500');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*5000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*2500');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*2300');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*1150');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30104', '({30015}+{30016})*300*12');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*2300');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*5000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*3000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30102', '({30015}+{30016})*1500');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30006}+{30061}+{30008}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*3800*12');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30210', '({30030}+{30031}+{30032})*38000+{30033}*23000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30210', '({30030}+{30031}+{30032}+{30033})*38000+{30036}*10000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30229', '({30015}+{30016})*1400');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30228', '({30015}+{30016})*450');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30216', '({30015}+{30016})*1300');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30216', '({30015}+{30016})*650');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30307', '({30015}+{30016})*360');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30051}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30052}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30053}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30054}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30055}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30302', '{30056}');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*4000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*3800');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*100*12');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*500*12');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30060}*0');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}/{30057}*150000');

insert into a_test (PAYOUT_ITEM_CODE, FORMULA_DET)
values ('30226', '{30057}*6000');

 

insert into b_test (ELEMENT_ID, NAME)
values ('30006', 'a1');

insert into b_test (ELEMENT_ID, NAME)
values ('30008', 'a2');

insert into b_test (ELEMENT_ID, NAME)
values ('30009', 'a3');

insert into b_test (ELEMENT_ID, NAME)
values ('30010', 'a4');

insert into b_test (ELEMENT_ID, NAME)
values ('30015', 'a5');

insert into b_test (ELEMENT_ID, NAME)
values ('30016', 'a6');

insert into b_test (ELEMENT_ID, NAME)
values ('30017', 'a7');

insert into b_test (ELEMENT_ID, NAME)
values ('30018', 'a8');

insert into b_test (ELEMENT_ID, NAME)
values ('30019', 'a9');

insert into b_test (ELEMENT_ID, NAME)
values ('30020', 'a10');

insert into b_test (ELEMENT_ID, NAME)
values ('30021', 'a11');

insert into b_test (ELEMENT_ID, NAME)
values ('30022', 'a12');

insert into b_test (ELEMENT_ID, NAME)
values ('30023', 'a13');

insert into b_test (ELEMENT_ID, NAME)
values ('30024', 'a14');

insert into b_test (ELEMENT_ID, NAME)
values ('30025', 'a15');

insert into b_test (ELEMENT_ID, NAME)
values ('30026', 'a16');

insert into b_test (ELEMENT_ID, NAME)
values ('30027', 'a17');

insert into b_test (ELEMENT_ID, NAME)
values ('30028', 'a18');

insert into b_test (ELEMENT_ID, NAME)
values ('30029', 'a19');

insert into b_test (ELEMENT_ID, NAME)
values ('30030', 'a20');

insert into b_test (ELEMENT_ID, NAME)
values ('30031', 'a21');

insert into b_test (ELEMENT_ID, NAME)
values ('30032', 'a22');

insert into b_test (ELEMENT_ID, NAME)
values ('30033', 'a23');

insert into b_test (ELEMENT_ID, NAME)
values ('30034', 'a24');

insert into b_test (ELEMENT_ID, NAME)
values ('30035', 'a25');

insert into b_test (ELEMENT_ID, NAME)
values ('30036', 'a26');

insert into b_test (ELEMENT_ID, NAME)
values ('30037', 'a27');

insert into b_test (ELEMENT_ID, NAME)
values ('30038', 'a28');

insert into b_test (ELEMENT_ID, NAME)
values ('30039', 'a29');

insert into b_test (ELEMENT_ID, NAME)
values ('30040', 'a30');

insert into b_test (ELEMENT_ID, NAME)
values ('30041', 'a31');

insert into b_test (ELEMENT_ID, NAME)
values ('30042', 'a32');

insert into b_test (ELEMENT_ID, NAME)
values ('30043', 'a33');

insert into b_test (ELEMENT_ID, NAME)
values ('30044', 'a34');

insert into b_test (ELEMENT_ID, NAME)
values ('30045', 'a35');

insert into b_test (ELEMENT_ID, NAME)
values ('30046', 'a36');

insert into b_test (ELEMENT_ID, NAME)
values ('30047', 'a37');

insert into b_test (ELEMENT_ID, NAME)
values ('30048', 'a38');

insert into b_test (ELEMENT_ID, NAME)
values ('30049', 'a39');

insert into b_test (ELEMENT_ID, NAME)
values ('30050', 'a40');

insert into b_test (ELEMENT_ID, NAME)
values ('30051', 'a41');

insert into b_test (ELEMENT_ID, NAME)
values ('30052', 'a42');

insert into b_test (ELEMENT_ID, NAME)
values ('30053', 'a43');

insert into b_test (ELEMENT_ID, NAME)
values ('30054', 'a44');

insert into b_test (ELEMENT_ID, NAME)
values ('30055', 'a45');

insert into b_test (ELEMENT_ID, NAME)
values ('30056', 'a46');

insert into b_test (ELEMENT_ID, NAME)
values ('30057', 'a47');

insert into b_test (ELEMENT_ID, NAME)
values ('30058', 'a48');

insert into b_test (ELEMENT_ID, NAME)
values ('30059', 'a49');

insert into b_test (ELEMENT_ID, NAME)
values ('30060', 'a50');

insert into b_test (ELEMENT_ID, NAME)
values ('30061', 'a51');

 

这里需要把a_test表里的formual替换成B_test里的名字。

 

这个如果用function或者是sp做,就没有什么难度了。

但是用sql做就需要多多考虑一下了

 

一下是我的sql

 

select gid, payout_item_code, formula_det, max(substr(txt, 1, length(txt)-1)) from (
select a.gid,
a.payout_item_code,
a.formula_det,
replace(sys_connect_by_path(decode(b.element_id, null, a.signal, replace(signal, b.element_id, b.name)),'##'), '##', '') txt
from
(select gid, payout_item_code, formula_det, row_number() over(partition by gid order by level) rn,
substr(formula_det, decode(rownum-(allcnt-selfcnt), 1, 1, instr(formula_det, '}', 1, rownum-(allcnt-selfcnt)-1)+1), instr(formula_det, '}', 1, rownum-(allcnt-selfcnt))-decode(rownum-(allcnt-selfcnt), 1, 0, instr(formula_det, '}', 1, rownum-(allcnt-selfcnt)-1))) signal
from (select a.payout_item_code, a.rowid gid,
a.formula_det||'}' formula_det,
length(a.formula_det) -
length(replace(a.formula_det, '}', '')) + 1 selfcnt,
sum(length(a.formula_det) - length(replace(a.formula_det, '}', ''))+1) over(order by rowid) allcnt, sum(length(a.formula_det) - length(replace(a.formula_det, '}', ''))+1) over() sumcnt
from a_test a) t1
start with (allcnt-selfcnt)=0 connect by rownum < sumcnt+1 and instr(formula_det, '}', 1, rownum-(allcnt-selfcnt)) >0) a
left join b_test b on instr(a.signal||'}', '{'||b.element_id||'}', 1, 1)>0
start with a.rn = 1 connect by prior a.gid = a.gid and prior a.rn + 1 = a.rn)
group by gid, payout_item_code, formula_det

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

inthirties

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值