我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)
这使得我可以使用任何字符/字符串来处理任何字符/字符串。
我在我的博客上写了一篇关于此的文章。
如果您的所有源字符串和替换字符串都只有一个字符长,您可以简单地使用该TRANSLATE函数:
SELECT translate('THIS IS UPPERCASE', 'THISUP', 'thisup')
FROM DUAL
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅Oracle 文档。