拆分2列中的特殊字符并在oracle中合并为多行

问题描述 投票:2回答:5

很高兴认识你们。我有一个名为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

很清楚

sql oracle plsql
5个回答
0
投票

这是一个解决方案,允许每个输入字符串中的任意数量的部分(两列中不一定相同,并且从一行到另一行变量)。两个连续的插入符号表示该令牌的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 

0
投票

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>

0
投票

你可以一起使用regexp_substrregexp_countconcat

  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

Demo


0
投票

所以,你有2个colums只有值qazxsw poi和qazxsw poi ..你可以使用qazxsw poi:

TN^AN^KA

123^456^987


0
投票

使用regexp_substr获取所需的结果。

substr()
© www.soinside.com 2019 - 2024. All rights reserved.