Oracle заменит слово в середине - PullRequest
0 голосов
/ 14 марта 2019

fse.name = ASD-122-XXX и fn.name = ASD-125-FFF

Я хочу поместить все fn.name 122 из fse.name, ассоциированные с 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 голосов
/ 15 марта 2019

Если ваши имена всегда в одном и том же формате, т.е. 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() по соображениям производительности.

0 голосов
/ 15 марта 2019

Почему вы не пытаетесь с помощью функции INSTR выяснить, есть ли ваша строка поиска в переменной назначения или нет? если его там, то просто используйте REPLACE, чтобы заменить строку вашей строкой желаний. Я думаю, это сработало бы для вас .. потому что каждый раз, когда вам не нужно находить позицию вашей строки поиска.

Насколько я понимаю, он хочет заменить 122 из fse.name на строку fn.name. так ниже мой код для этого. декларировать номер v_instr; 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); конец если; концевой цикл; конец;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...