对 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 数据库列执行多个替换操作的主要内容,如果未能解决你的问题,请参考以下文章