复杂的子串替换查询SQL

时间:2013-05-14 02:06:40

标签: sql oracle replace

我有下表包含路径信息:

我需要递归地将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

2 个答案:

答案 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;

这不是一种特别有效的方法,但可能这是一次性的练习。