Plsql Oracle11g:使用字典映射替换部分字符串

Plsql Oracle11g:使用字典映射替换部分字符串,plsql,oracle11g,oracle11gr2,Plsql,Oracle11g,Oracle11gr2,使用字典映射更改字符串中的值有什么好方法吗?例如,我有表1 和一些映射表dict1: 我需要一些SELECT语句,该语句将拆分表1中的值。行1并使用映射字典dict1更改单词,以便接收到的值(将现有字典值更改为上限是可选的): 另外,使用REGEXP表达式拆分将非常好 WITH dict1 AS (SELECT 'THIS' fr, 'THAT' t FROM dual UNION ALL SELECT 'IS' fr, 'ARE' t

使用字典映射更改字符串中的值有什么好方法吗?例如,我有
表1

和一些映射表
dict1

我需要一些
SELECT
语句,该语句将拆分
表1中的值。行1
并使用映射字典
dict1
更改单词,以便接收到的值(将现有字典值更改为上限是可选的):

另外,使用REGEXP表达式拆分将非常好

WITH dict1 AS
 (SELECT 'THIS' fr,
         'THAT' t
    FROM dual
  UNION ALL
  SELECT 'IS' fr,
         'ARE' t
    FROM dual
  UNION ALL
  SELECT 'EXAMPLE' fr,
         'SOURCE' t
    FROM dual
  UNION ALL
  SELECT 'STRING' fr,
         'NUMBER' t
    FROM dual),
table1 AS
 (SELECT 'This is an example string' AS str,
         1 AS sn
    FROM dual
  UNION ALL
  SELECT 'This String has typ0s' AS str,
         2 sn
    FROM dual),
src AS
 (SELECT regexp_substr(upper(s.str), '[^ ]+', 1, LEVEL) str2,
         s.*,
         rownum nn
    FROM table1 s
  CONNECT BY instr(TRIM(' ' FROM str), ' ', 1, LEVEL - 1) > 0
         AND PRIOR sn = sn
         AND PRIOR dbms_random.value IS NOT NULL),
repl AS
 (SELECT nvl2(dict1.t, dict1.t, src.str2) lex,
         sn,
         nn
    FROM src
    LEFT JOIN dict1
      ON dict1.fr = src.str2)
SELECT listagg(lex, ' ') within GROUP(ORDER BY nn),
       sn
  FROM repl
 GROUP BY sn
它现在可以按你的要求工作了。享受


编辑:使用解决方案

您介意函数中的PLSQL吗?非常令人印象深刻。。但您能否解释一下为什么要添加
和先前的dbms_random.value不为NULL
?以便在解析字符串时消除可能的循环。有时候,当我们在一个字符串中有相等的值时,比如“oo bb oo”,根据你的回答,我修改了我的小提琴,因为我可以看到它返回你想要的东西,所以我很高兴:)
+-------------------------+
|     OLD    |    NEW     |
+-------------------------+
| THIS       | THAT       |
| IS         | ARE        |
| EXAMPLE    | SOURCE     |
| STRING     | NUMBER     |
+------------+------------+
+---------------------------+
|      TRANS_ROW1           |
+---------------------------+
| THAT ARE AN SOURCE NUMBER |
| THAT NUMBER HAS TYP0S     |
+---------------------------+
WITH dict1 AS
 (SELECT 'THIS' fr,
         'THAT' t
    FROM dual
  UNION ALL
  SELECT 'IS' fr,
         'ARE' t
    FROM dual
  UNION ALL
  SELECT 'EXAMPLE' fr,
         'SOURCE' t
    FROM dual
  UNION ALL
  SELECT 'STRING' fr,
         'NUMBER' t
    FROM dual),
table1 AS
 (SELECT 'This is an example string' AS str,
         1 AS sn
    FROM dual
  UNION ALL
  SELECT 'This String has typ0s' AS str,
         2 sn
    FROM dual),
src AS
 (SELECT regexp_substr(upper(s.str), '[^ ]+', 1, LEVEL) str2,
         s.*,
         rownum nn
    FROM table1 s
  CONNECT BY instr(TRIM(' ' FROM str), ' ', 1, LEVEL - 1) > 0
         AND PRIOR sn = sn
         AND PRIOR dbms_random.value IS NOT NULL),
repl AS
 (SELECT nvl2(dict1.t, dict1.t, src.str2) lex,
         sn,
         nn
    FROM src
    LEFT JOIN dict1
      ON dict1.fr = src.str2)
SELECT listagg(lex, ' ') within GROUP(ORDER BY nn),
       sn
  FROM repl
 GROUP BY sn