fse.name = ASD-122-XXX
和fn.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;
答案 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()
完成的任务使用正则表达式。