Oracle中的多个REPLACE函数

Adn*_*nan 22 oracle replace

REPLACE在oracle中使用函数来替换我的字符串中的值;

 SELECT REPLACE('THE NEW VALUE IS #VAL1#','#VAL1#','55') from dual
Run Code Online (Sandbox Code Playgroud)

所以这可以替换一个值,但是20+以上,我应该使用20+ REPLACE功能还是有更实用的解决方案.

欢迎所有想法.

小智 41

即使这个线程是旧的,也是Google上的第一个,所以我将使用正则表达式发布与此处实现的函数相当的Oracle.

比嵌套的replace()快得多,而且更干净.

在给定表的字符串列中用'd'替换字符串'a','b','c'

select regexp_replace(string_col,'a|b|c','d') from given_table
Run Code Online (Sandbox Code Playgroud)

它只不过是带有'或'运算符的几个静态模式的正则表达式.

谨防正则表达式特殊字符!


Pet*_*ang 22

如何在Oracle中一起替换多个字符串的接受答案建议使用嵌套REPLACE语句,我认为没有更好的方法.

如果你要大量使用它,你可以考虑编写自己的函数:

CREATE TYPE t_text IS TABLE OF VARCHAR2(256);

CREATE FUNCTION multiple_replace(
  in_text IN VARCHAR2, in_old IN t_text, in_new IN t_text
)
  RETURN VARCHAR2
AS
  v_result VARCHAR2(32767);
BEGIN
  IF( in_old.COUNT <> in_new.COUNT ) THEN
    RETURN in_text;
  END IF;
  v_result := in_text;
  FOR i IN 1 .. in_old.COUNT LOOP
    v_result := REPLACE( v_result, in_old(i), in_new(i) );
  END LOOP;
  RETURN v_result;
END;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

SELECT multiple_replace( 'This is #VAL1# with some #VAL2# to #VAL3#',
                         NEW t_text( '#VAL1#', '#VAL2#', '#VAL3#' ),
                         NEW t_text( 'text', 'tokens', 'replace' )
                       )
FROM dual
Run Code Online (Sandbox Code Playgroud)

这是一些要替换的标记的文本

如果所有标记都具有相同的格式('#VAL' || i || '#'),则可以省略参数in_old并使用循环计数器.


Gar*_*ers 22

请记住后果

SELECT REPLACE(REPLACE('TEST123','123','456'),'45','89') FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

将用456替换123,然后发现它可以用89替​​换45.对于具有相同结果的函数,它必须复制优先级(即以相同的顺序替换字符串).

类似地,取一个字符串'ABCDEF',并指示它用'123'替换'ABC'和用'xyz'替换'CDE'仍然需要考虑优先级来确定它是否转到'123EF'或ABxyzF'.

简而言之,很难想出一些比嵌套REPLACE更简单的泛型(虽然更多的sprintf样式函数会是一个有用的补充).


小智 5

这是一篇旧文章,但我最终使用了 Peter Lang 的想法,并做了类似但不同的方法。这是我所做的:

CREATE OR REPLACE FUNCTION multi_replace(
                        pString IN VARCHAR2
                        ,pReplacePattern IN VARCHAR2
) RETURN VARCHAR2 IS
    iCount  INTEGER;
    vResult VARCHAR2(1000);
    vRule   VARCHAR2(100);
    vOldStr VARCHAR2(50);
    vNewStr VARCHAR2(50);
BEGIN
    iCount := 0;
    vResult := pString;
    LOOP
        iCount := iCount + 1;

        -- Step # 1: Pick out the replacement rules
        vRule := REGEXP_SUBSTR(pReplacePattern, '[^/]+', 1, iCount);

        -- Step # 2: Pick out the old and new string from the rule
        vOldStr := REGEXP_SUBSTR(vRule, '[^=]+', 1, 1);
        vNewStr := REGEXP_SUBSTR(vRule, '[^=]+', 1, 2);

        -- Step # 3: Do the replacement
        vResult := REPLACE(vResult, vOldStr, vNewStr);

        EXIT WHEN vRule IS NULL;
    END LOOP;

    RETURN vResult;
END multi_replace;
Run Code Online (Sandbox Code Playgroud)

然后我可以这样使用它:

SELECT  multi_replace(
                        'This is a test string with a #, a $ character, and finally a & character'
                        ,'#=%23/$=%24/&=%25'
        )
FROM dual
Run Code Online (Sandbox Code Playgroud)

这使得我可以使用任何字符/字符串来处理任何字符/字符串。

我在我的博客上写了一篇关于此的文章。


Fra*_*itt 5

如果您的所有源字符串和替换字符串都只有一个字符长,您可以简单地使用该TRANSLATE函数:

  SELECT translate('THIS IS UPPERCASE', 'THISUP', 'thisup') 
  FROM DUAL
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Oracle 文档