2013-07-03 31 views
2

是否有任何好的技巧,使用字典映射更改字符串中的值?比如我有table1FIDDLEOracle 11g:使用字典映射替换字符串的一部分

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

有些映射表dict1FIDDLE

+-------------------------+ 
|  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表达式分割将会非常好..

+0

你介意PLSQL的函数? – Randy

回答

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 

它现在可以按照您的要求工作。请享用。

编辑:FIDDLE与解决方案

+0

非常令人印象深刻..但你能解释为什么你添加'和先前的dbms_random.value IS NOT NULL'? – WBAR

+0

为了在解析字符串期间摆脱可能的循环。有时它会发生,当我们在一个字符串中有相同的值时,像'oo bb oo' –

+0

根据你的回答我修改了我的小提琴http://sqlfiddle.com/#!4/d0a21/10/0 – WBAR