我有下表包含路径信息:
我需要递归地将PATH字段中的DIRECTORY_NAME值替换为NEW_DIR_NAME值。
样本表:
PATH | DIRECTORY_NAME | NEW_DIR_NAME
.................................................. .................................................. ...........
\文件夹1 \文件夹2 \ 2A |文件夹2 \ 2A | folder2 / 2a
\文件夹1 \文件夹2 \ 2A \ folder3 | folder3 | folder3
\文件夹1 \文件夹2 \ 2A \ folder4 | folder4 | folder4
\ folder1中\文件夹2 \ 2A \ folder4 \ 2A \ 2B | 2A \ 2B | 2a / 2b
.................................................. .................................................. ...........
结果如下所示:
*更改以粗体显示
NEW_PATH
.................................................. .................................................. ...........
\ folder1 \ folder2 / 2a
\ folder1 \ folder2 / 2a \ folder3
\ folder1 \ folder2 / 2a \ folder4
\ folder1 \ folder2 / 2a \ folder4 \ 2a / 2b
.................................................. .................................................. ...........
数据库是Oracle。
使用选择替换(PATH,DIRECTORY_NAME,NEW_DIR_NAME)功能将产生以下内容(不是解决方案):
\ folder1 \ folder2 / 2a
\ folder1 \ folder2 \ 2a \ folder3
\ folder1 \ folder2 \ 2a \ folder4
\ folder1 \ folder2 \ 2a \ folder4 \ 2a / 2b
答案 0 :(得分:1)
请告诉我你的字段名称不是STRING
。无论如何,这里是您需要的代码,基于提供的字段名称。
SELECT REPLACE(STRING,REFERENCE,REPLACE_WITH)
答案 1 :(得分:1)
您的问题是您的数据。您的表格在PATH和DIRECTORY_NAME之间建立了一对一的关系,因此与NEW_DIR_NAME建立了一对一的关系。但根据你要求的输出,显然不是这样。 DIRECTORY_NAME出现在多个PATH值中。
所以你需要做的是为replace()
DIRECTORY_NAME != NEW_DIR_NAME
语句
for lrec in ( select DIRECTORY_NAME, NEW_DIR_NAME
from your_table
where DIRECTORY_NAME != NEW_DIR_NAME )
loop
update your_table
set path = replace(PATH, lrec.DIRECTORY_NAME, lrec.NEW_DIR_NAME)
;
end loop;
这不是一种特别有效的方法,但可能这是一次性的练习。