甲骨文在中间替换一个词

时间:2019-03-14 19:26:52

标签: sql string oracle

fse.name = ASD-122-XXXfn.name = ASD-125-FFF

我想将fn.name的所有fse.name的122关联到fse.name

我有这个,但是不能按我想要的方式工作

var_rama VARCHAR2;

Begin
FOR var in (select fse.name ,fn.name as nombreFnode, fn.descr 
            from fiberspliceenclosure_lt fse 
            inner join segments seg
                on fse.mslink = seg.link1
            inner join fibernode fn
                on fn.mslink = seg.link2
            where fse.name like 'CO905%'
            and fn.descr like '04-%')
LOOP
  var.(substr(fse.name,7,5)) := var_rama;
  replace (substr (fn.name,7,5), var_rama);


END LOOP;

2 个答案:

答案 0 :(得分:0)

为什么不尝试使用INSTR函数来查找目标变量中是否存在查找字符串?如果它在那里,则只需使用REPLACE即可将字符串替换为所需的字符串。我猜想,这对您有用。.因为每次您都不需要查找搜索字符串的位置时。

据我了解,他想用fn.name字符串替换fse.name中的122。所以下面是我的代码。     宣布     v_instr number;     v_out varchar2(50);     开始     对于我在(sql_query)循环中     v_instr:= instr(i.fse_name,'122');     如果v_instr> 0则     v_out:= replace(i.fse_name,'122',i.fn_name);     万一;     结束循环     结束;

答案 1 :(得分:0)

如果您的姓名始终使用相同的格式,即AAA-999-AAA,那么只需进行substr()调用就很简单了:

select substr(fn.name, 1, 4) 
       || substr(fse.name, 5, 3) 
       || substr(fn.name, 8) as new_name
from fn
     join fse on fn.id = fse.id
/     

但是,如果名称格式可以变化-说AAAA-99-AAAAA是有效的-那么我们就不能使用固定偏移量。因此,通过instr()调用来标识每个破折号的位置,代码变得更加复杂:

select substr(fn.name, 1, instr(fn.name, '-', 1, 1)) 
       || substr(fse.name, instr(fse.name, '-', 1, 1)+1, instr(fse.name, '-', 1, 2) - instr(fse.name, '-', 1, 1)-1 )
       || substr(fn.name, instr(fn.name, '-', 1, 2)) as new_name
from fn
     join fse on fn.id = fse.id
/ 

毫无疑问,有一个使用正则表达式的解决方案更时髦,但出于性能原因,我宁愿避免使用substr()instr()完成的任务使用正则表达式。