简化替换 oracle 函数

Simplifying a replace oracle function

使用替换函数 DML 简化更新。

是否有简化的方法来转换下面的代码(示例)

update A
set TERMS = trim(replace(TERMS,'-',','))
/
update A
set TERMS = trim(replace(TERMS,'A','B'))
/
update A
set TERMS = trim(replace(TERMS,'C','D'))
/
update A
set TERMS = trim(replace(TERMS,'E','F'))
/
update A
set TERMS = trim(replace(TERMS,'111','222'))
/
update A
set TERMS = trim(replace(TERMS,'......','......'))

将此代码转换为单个脚本。

好吧,您可以嵌套调用 UPDATE:

update A
set TERMS = trim(replace(replace(
    replace(replace(
        replace(TERMS, '-', ','), 'A', 'B'), 'C', 'D'), 'E', 'F'), '111', '222'))

另一个明显的可能选项是正则表达式替换。但是,这在这里没有多大帮助,因为即使我们可以轻松地在一个正则表达式中用短语表达所有目标,每个目标都有一个单独的替换。

你这样替换的链:

update A set terms=trim(replace(replace(terms,'A','B'),'C','D'));

您可以嵌套 replace() 或使用 translate()。如果您的字符串全部是字母数字和一些其他字符:

update a
    set TERMS = trim(replace(translate(terms, '- ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ', BBDDFFGHIJKLMNOPQRSTUVWXYZ0123456789'), '111', '222'))

您可以使用 TRANSLATE 来更改单个字符(并且不需要指定完整的字母表,只需指定您正在翻译的字符)并且可以嵌套 REPLACE 语句:

update A
SET TERMS = TRIM(
              REPLACE(
                REPLACE(
                  TRANSLATE( TERMS, 'ACE-', 'BDF,' ),
                  '111',
                  '222'
                ),
                '......',
                '......'
              )
            )

db<>fiddle here