我正在尝试构建一个Regex_替换工作区,使其成为一个冗长且经常令人困惑的替换(Oracle12c)
select语句如下所示:我正在尝试构建一个Regex_替换工作区,使其成为一个冗长且经常令人困惑的替换(Oracle12c),oracle,oracle12c,Oracle,Oracle12c,select语句如下所示: SELECT replace ( replace ( replace ( replace (table.ADDRESS,'Scarborough',' XXScarborough '), 'North York','XXX York '),'Toronto','XXXToronto '),'ON','NON ') as address,... 另一种方法是将模式和替换存储在关联数组中,并将其放入一个数组中。虽然它不会比你的替换品短,但它肯定不会
SELECT replace ( replace ( replace
( replace (table.ADDRESS,'Scarborough',' XXScarborough '),
'North York','XXX York '),'Toronto','XXXToronto
'),'ON','NON ') as address,...
另一种方法是将模式和替换存储在关联数组中,并将其放入一个数组中。虽然它不会比你的替换品短,但它肯定不会那么“混乱”
再简单不过了。REGEX允许您在一次搜索中搜索多个模式(不像REPLACE),但它仍然只允许您搜索一个替换字符串;您不能指示它用相应的(和不同的)替换文本替换四种模式中的每一种。此外,您应该使用代码格式化工具对问题中的代码进行格式化。谢谢!你的回答很有用。我也不再考虑“Regex替换”来满足我在这种情况下的特殊需要
WITH 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('Scarborough') := (' XXScarborough ');
v_pat('North York') := ('XXX York ');
v_pat('Toronto') := ('XXXToronto ');
v_pat('ON') := ('NON ');
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;
SELECT my_replace(t.ADDRESS) --,other columns
FROM mytable t;