使用regexp_substr获取所需的结果。
select REGEXP_SUBSTR(col1,'[^\^]+',1,level)||REGEXP_SUBSTR(col2,'[^\^]+',1,level) as res from A_TEST connect by REGEXP_SUBSTR(col1,'[^\^]+',1,level) is not null;
这是一个解决方案,允许每个输入字符串中的任意数量的部分(两列中不一定相同,并且从一行到另一行变量)。两个连续的插入符号表示该令牌的NULL。我添加了一个ID(所以你会知道每个输出字符串来自哪里),我添加了一个ORD列来显示第一个令牌与第二个和第三个令牌等。
在查询中,我使用LATERAL子句(自Oracle 12.1起可用),它允许我们独立于其他行处理每个输入行 - 这使得查询更快更简单。在正则表达式中,请注意必须转义插入符号(否则它意味着“字符串的开头”), 除了 在字符集中(这里:否定的字符集),其中metasymbols失去了它们的特殊含义。
的 新设置 强>
drop table a purge; Create table a (id number, col1 varchar2(20), col2 varchar2(20)); insert into a values (101, 'TN^AN^KA','123^456^987'); insert into a values (102, 'AB^CE^YZZ', '234^000'); insert into a values (103, 'AB', '0230'); commit;
的 查询和输出 强>
select a.id, l.ord, l.token from a, lateral (select level as ord, regexp_substr(col1, '([^^]*)(\^|$)', 1, level, null, 1) || regexp_substr(col2, '([^^]*)(\^|$)', 1, level, null, 1) as token from dual connect by level <= 1 + greatest(regexp_count(col1, '\^'), regexp_count(col2, '\^')) ) l order by id, ord; ID ORD TOKEN ----- --- -------- 101 1 TN123 101 2 AN456 101 3 KA987 102 1 AB234 102 2 CE000 102 3 YZZ 103 1 AB0230
怎么样 REGEXP_SUBSTR ?我稍微修改了输入数据,以便不统一设置返回值。它有什么作用?需要 话 之间 ^ 字符。如果分隔符发生更改,则此代码可能(或可能不)起作用。
REGEXP_SUBSTR
^
SQL> with test (col1, col2) as 2 (select 'TN^AN^KA', '123^45^6789' from dual) 3 select regexp_substr(col1, '\w+', 1, 1) || regexp_substr(col2, '\w+', 1, 1) res1, 4 regexp_substr(col1, '\w+', 1, 2) || regexp_substr(col2, '\w+', 1, 2) res2, 5 regexp_substr(col1, '\w+', 1, 3) || regexp_substr(col2, '\w+', 1, 3) res3 6 from test; RES1 RES2 RES3 ----- ---- ------ TN123 AN45 KA6789 SQL>
所以,你有两个只有值的列 TN^AN^KA 和 123^456^987 .. 您可以使用 substr() :
TN^AN^KA
123^456^987
substr()
select substr(A.col1,1,2)||substr(A.col2,1,3) from table A union all select substr(A.col1,4,2)||substr(A.col2,5,3) from table A union all select substr(A.col1,7,2)||substr(A.col2,9,3) from table A
结果: