-1

我有下表包含路径信息:

我需要用 NEW_DIR_NAME 值递归地替换 PATH 字段中的 DIRECTORY_NAME 值。

样品表:

路径 |DIRECTORY_NAME |NEW_DIR_NAME
................................... ..................................................... ................
\文件夹1\文件夹2\2a | 文件夹2\2a | 文件夹2 /2a
\folder1\folder2\2a\folder3 | 文件夹3 | 文件
夹3\文件夹1\文件夹2\2a\文件夹4 | 文件夹4 | 文件夹4
\文件夹1\文件夹2\2a\文件夹4\2a\2b | 2a\2b | 2a/2b
................................................... ..................................................... .....................
结果将如下所示: * 更改以粗体显示

新路径
.................................................. ..................................................... ......
\folder1\ folder2/2a
\folder1\ folder2/2a \folder3
\folder1\ folder2/2a \folder4
\folder1\ folder2/2a \folder4\ 2a/2b
.... ..................................................... ..................................................... …………

数据库是甲骨文。

使用select replace(PATH, DIRECTORY_NAME, NEW_DIR_NAME)函数将产生以下(不是解决方案):

\folder1\ folder2/2a
\folder1\folder2\2a\ folder3
\folder1\folder2\2a\ folder4
\folder1\folder2\2a\folder4\ 2a/2b

4

2 回答 2

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;

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

于 2013-05-14T06:38:33.160 回答
1

请告诉我你的字段名不是真的STRING。无论如何,这是您需要的代码,基于提供的字段名称。

SELECT REPLACE(STRING,REFERENCE,REPLACE_WITH)
于 2013-05-14T02:21:12.863 回答