我正在尝试构建一个Regex_替换工作区,使其成为一个冗长且经常令人困惑的替换(Oracle12c)

我正在尝试构建一个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语句如下所示:

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;