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

Posted

技术标签:

【中文标题】对 Oracle 数据库列执行多个替换操作【英文标题】:Performing multiple Replace operations on an Oracle database column 【发布时间】:2018-04-13 15:52:05 【问题描述】:

我目前在 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')

【问题讨论】:

检查我的答案,让我知道它是否有效。请阅读:***.com/help/someone-answers. 【参考方案1】:

您可以嵌套replace() 调用:

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

Oracle 还提供regexp_replace()。您可能会发现这对您的某些数据转换很方便。

【讨论】:

你的速度更快 :),只是好奇什么是最大嵌套函数限制(255 或 32)? 我将如何使用 regexp_replace 来实现相同的目标?我担心我会遇到***别的嵌套函数 @lad2025 。 . .我碰巧知道在 SQL Server 中大约是 32。我不知道 Oracle 中的限制是什么。【参考方案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

【讨论】:

【参考方案3】:

由于这是 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);

【讨论】:

以上是关于对 Oracle 数据库列执行多个替换操作的主要内容,如果未能解决你的问题,请参考以下文章

在ORACLE中怎么对LONG类型字段的模糊查询

关于oracle中换行符替换问题

oracle怎样查询数据库函数是不是被执行

如何对sql数据库中的某一字段进行替换?

oracle 将一列数字分为多个为1的行

在oracle中怎么对一张表中的列进行循环,比如说,我执行第一个字段,再执行第二个。。。一直到N