2

辞書マッピングを使用して文字列の値を変更するための良いトリックはありますか? たとえば、私はtable1 フィドルを持っています

+---------------------------+
|          ROW1             |
+---------------------------+
| This is an example string |
| This String has typ0s     |
+---------------------------+

そしていくつかのマッピングテーブルdict1 FIDDLE :

+-------------------------+
|     OLD    |    NEW     |
+-------------------------+
| THIS       | THAT       |
| IS         | ARE        |
| EXAMPLE    | SOURCE     |
| STRING     | NUMBER     |
+------------+------------+

SELECT値を分割しtable1.row1、マッピング辞書を使用して単語を変更するステートメントが必要なdict1ので、受信した値は次のようになります (既存の辞書値を上限に変更することはオプションです)。

+---------------------------+
|      TRANS_ROW1           |
+---------------------------+
| THAT ARE AN SOURCE NUMBER |
| THAT NUMBER HAS TYP0S     |
+---------------------------+

PS。REGEXP 式を使用した分割はとてもいいでしょう..

4

1 に答える 1

1
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

あなたが尋ねるように、それは今動作します。楽しみ。

編集:解決策をフィドル

于 2013-07-03T13:43:11.857 に答える