#sql #oracle #plsql #plsql_developer
Есть строка '/home/pc/test' , и слова в тегах '[/alseko][/logs][/archive]' Как получить ожидаемый результат = [/home/pc/test/alseko][/home/pc/test/logs][/home/pc/test/archive] Мой код, пытаюсь найти: select '[' || '/home/pc/test' || ltrim(substr('[/alseko][/logs][/archive]', instr('[/alseko][/logs][/archive]', '['), instr('[/alseko][/logs][/archive]', ']')),'[') from dual
Ответы
Ответ 1
Надо распарсить теги в таблицу, и потом заново собрать в строку, например так: with data as ( select '[/alseko][/logs][/archive]' tags, '\[(\/\w+)' pattern, '/home/pc/test' prefix from dual ), tags as ( select '['||prefix||regexp_substr (tags, pattern, 1, level, null, 1)||']' tag, level sort from data connect by level <= regexp_count (tags, pattern) ) select listagg (tag) within group (order by sort) from tags ; Вывод: [/home/pc/test/alseko][/home/pc/test/logs][/home/pc/test/archive]Ответ 2
Получился сделать через цикл, сперва определил количество вхождений Declare vn_count_paths Integer; vc_paths varchar(1024); vc_FtpDir varchar(1024); begin vn_count_paths:= length('[/alseko][/logs][/archive]')-LENGTH(REPLACE('[/alseko][/logs][/archive]','[')); dbms_output.put_line('Size: ' || vn_count_paths); for i in 1 .. vn_count_paths loop vc_paths:= vc_paths||'['||'/home/pc/test'||ltrim(substr('[/alseko][/logs][/archive]',instr('[/alseko][/logs][/archive]','[',1,i)+1, instr('[/alseko][/logs][/archive]',']',1,i)- instr('[/alseko][/logs][/archive]','[',1,i)-1),'[')||']'; end loop; vc_FtpDir := '['||'/home/pc/test'||']'||vc_paths; dbms_output.put_line('vc_FtpDir: ' || vc_FtpDir); end;
Комментариев нет:
Отправить комментарий