很高兴认识你们。我有一个名为A.的表。表包含两列名为col1和col2的列。具有类似TN ^ AN ^ KA ^和col2的数据的Col1包含123 ^ 456 ^ 987。
需要删除^字符并将两个列值合并为多行,如下所示。
DDL:
Create table a (col1 varchar2(20), col2 varchar2(20));
DML:
insert into values ('TN^AN^KA','123^456^987');
commit;
select * from a;
---------- --------------
col1 col2
--------- ---------------
TN^AN^KA 123^456^987
TN123
AN456
很清楚
这是一个解决方案,允许每个输入字符串中的任意数量的部分(两列中不一定相同,并且从一行到另一行变量)。两个连续的插入符号表示该令牌的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
怎么样?我稍微修改了输入数据,以便不统一设置返回值。它有什么作用?在^
字符之间采取措辞。如果分隔符发生更改,则此代码可能(或可能不)起作用。
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>
你可以一起使用regexp_substr
,regexp_count
和concat
:
with a(col1, col2) as
(
select 'TN^AN^KA','123^456^987' from dual
)
select concat(
regexp_substr(col1, '[^\^]+', 1, level),
regexp_substr(col2, '[^\^]+', 1, level)
) as "Result String"
from a
connect by level <= regexp_count(col1, '\^') + 1;
Result String
-------------
TN123
AN456
KA987
所以,你有2个colums只有值qazxsw poi和qazxsw poi ..你可以使用qazxsw poi:
TN^AN^KA
123^456^987
使用regexp_substr获取所需的结果。
substr()