在Oracle数据库列上执行多个替换操作

3

我当前有一堆字符串存储在Oracle数据库列中,我需要对它们进行更改,目前我正在运行多个更新语句来完成此操作。

UPDATE TABLE1 SET COLUMN1 = REPLACE 
(COLUMN1, 'ABC', 'SR1')
UPDATE TABLE1 SET COLUMN1 = REPLACE  
(COLUMN1, '123', 'SR2')
UPDATE TABLE1 SET COLUMN1 = REPLACE  
(COLUMN1, 'XYZ', 'SR3')
UPDATE TABLE1 SET COLUMN1 = REPLACE    
(COLUMN1, '789', 'SR4')

有没有一种方法可以一次性完成这个任务,例如?
UPDATE TABLE1 
SET
COLUMN1 = REPLACE(COLUMN1, 'XYZ', 'SR3'), 
COLUMN1 = REPLACE(COLUMN1, '789', 'SR4')
3个回答

8
你可以嵌套使用replace()方法:
UPDATE TABLE1
    SET COLUMN1 = REPLACE(REPLACE(REPLACE(REPLACE(COLUMN1, 'ABC', 'SR1'), '123', 'SR2'), 'XYZ', 'SR3'), '789', 'SR4');

Oracle还提供regexp_replace()。您可能会发现在某些数据转换中这非常方便。


你很快 :), 只是好奇最大嵌套函数限制是多少 (255 还是 32)? - Lukasz Szozda
我该如何使用regexp_replace来实现相同的功能?我担心可能会遇到最大嵌套函数级别的限制。 - jdmneon
@lad2025……我碰巧知道在SQL Server中是大约32个。我不知道Oracle的限制是什么。 - Gordon Linoff

2
您可以使用关联数组创建UDF。
CREATE OR REPLACE  FUNCTION my_replace (
    inp VARCHAR2
) RETURN VARCHAR2 IS
    v_out   VARCHAR2(1000) := inp;
    TYPE v_astype IS
        TABLE OF VARCHAR2(40) INDEX BY VARCHAR(40);
    v_pat      v_astype;
    v_idx      VARCHAR2(40);
BEGIN
   v_pat('ABC') := ('SR1');
   v_pat('123') := ('SR2');
   v_pat('XYZ') := ('SR3');
   v_pat('789') := ('SR4');
    v_idx := v_pat.first;
    WHILE v_idx IS NOT NULL LOOP
        v_out := replace(v_out,v_idx,v_pat(v_idx) );
        v_idx := v_pat.next(v_idx);
    END LOOP;
    RETURN v_out;
END; 
/

至少现在,你的更新语句看起来很清晰。
UPDATE TABLE1
    SET COLUMN1 = my_replace(column1) ;

另外,对于 Oracle 12c 及以上版本,您可以使用内联函数(如果您只是想在 select 中使用函数,则此方法有效)。

https://oracle-base.com/articles/12c/with-clause-enhancements-12cr1


0

由于这是Oracle,您可以编写一个PL/SQL函数来进行转换:

create or replace function multi_replace(vi_string varchar2) return varchar2 is
  vo_string varchar2(4000);
begin
  vo_string := vi_string;
  vo_string := replace(vo_string, 'XYZ', 'SR3');
  vo_string := replace(vo_string, '789', 'SR4');
  ...
  return vo_string;
end;

然后在查询中调用它:

update mytable set column1 = multi_replace(column1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接