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