Я пытаюсь создать обходной путь Regex_Replace для долгой и часто сбивающей с толку замены (Oracle12c) - PullRequest
0 голосов
/ 09 ноября 2018

Оператор выбора выглядит так:

SELECT replace ( replace ( replace
( replace (table.ADDRESS,'Scarborough',' XXScarborough '),
     'North York','XXX York '),'Toronto','XXXToronto 
     '),'ON','NON ') as address,...

1 Ответ

0 голосов
/ 10 ноября 2018

Одной из альтернатив является сохранение шаблона и замены в ассоциативном массиве, поместив его в с функцией предложения . Хотя он не короче вашей замены, он определенно должен быть менее «запутанным».

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;

Демо

...