首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Oracle数据库列执行多个替换操作

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

Stack Overflow用户
提问于 2018-04-13 15:52:05
回答 3查看 7.2K关注 0票数 3

目前,我需要更改Oracle数据库列中的一串字符串,现在我正在运行多个update语句来实现这一点。

代码语言:javascript
复制
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')

有什么办法让我一蹴而就吗?--例如

代码语言:javascript
复制
UPDATE TABLE1 
SET
COLUMN1 = REPLACE(COLUMN1, 'XYZ', 'SR3'), 
COLUMN1 = REPLACE(COLUMN1, '789', 'SR4')
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-13 15:53:46

您可以嵌套replace()调用:

代码语言:javascript
复制
UPDATE TABLE1
    SET COLUMN1 = REPLACE(REPLACE(REPLACE(REPLACE(COLUMN1, 'ABC', 'SR1'), '123', 'SR2'), 'XYZ', 'SR3'), '789', 'SR4');

甲骨文还提供regexp_replace()。对于某些数据转换,您可能会发现这很方便。

票数 8
EN

Stack Overflow用户

发布于 2018-04-13 16:20:55

您可以使用关联数组创建UDF。

代码语言:javascript
复制
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语句看起来很干净:

代码语言:javascript
复制
UPDATE TABLE1
    SET COLUMN1 = my_replace(column1) ;

此外,对于Oracle12c及以上版本,您可以使用内联函数(如果您只想在select中使用函数,则可以使用内联函数)。

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

票数 2
EN

Stack Overflow用户

发布于 2018-04-13 16:24:48

由于这是Oracle,所以可以编写PL/SQL函数来执行转换:

代码语言:javascript
复制
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;

然后在查询中调用它:

代码语言:javascript
复制
update mytable set column1 = multi_replace(column1);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49820900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档