使用sql中的reqular表达式将字符串拆分为多个列

时间:2018-03-13 10:14:59

标签: sql oracle

目前我的表中有一个名为TEXT的列,其数据包含“高SMS使用率 - VPMN:XXXXX - SRC:XXX - SDR:XX.YY - 将报告

通过使用带分隔符( - )的正则表达式,我可以分隔字符串,如附加的屏幕截图Screen shot1 但我想以这种方式screen shot2 以下是我正在使用的查询。enter image description here 请建议我如何使用正则表达式来获得我想要的输出。

1 个答案:

答案 0 :(得分:1)

也许你可以使用REGEXP_SUBSTR()和REPLACE()的组合。

测试数据:

create table messages ( message_ )
as
select 'High SMS usage - VPMN: PHLGT - SRC: NRT - SDR: 22.64 - Will Report' from dual union all
select 'High SMS usage - VPMN: ABCDE - SRC: ABCD - SDR: 222.64 - Will Report' from dual union all
select 'High SMS usage - VPMN: FGHI - SRC: EFG - SDR: 2222.64 - Will Report' from dual union all
select 'High SMS usage - VPMN: JKL - SRC: HIJK - SDR: 222.64 - Will Report' from dual union all
select 'High SMS usage - VPMN: MNOPQR - SRC: LMN - SDR: 22.64 - Will Report' from dual ;

查询:

select
  replace( regexp_substr( noblanks, '[^-]+', 1, 2), 'VPMN:' ) as VPMN 
, replace( regexp_substr( noblanks, '[^-]+', 1, 3), 'SRC:'  ) as DATA_SRC
, replace( regexp_substr( noblanks, '[^-]+', 1, 4), 'SDR:'  ) as SDR_VALUE
, text_
from (
  select 
    replace( message_, ' ' ) as noblanks  -- message without blanks
  , message_ as text_                     -- original message
  from messages 
) ;

-- result
VPMN    DATA_SRC  SDR_VALUE  TEXT_                                                                 
PHLGT   NRT       22.64      High SMS usage - VPMN: PHLGT - SRC: NRT - SDR: 22.64 - Will Report    
ABCDE   ABCD      222.64     High SMS usage - VPMN: ABCDE - SRC: ABCD - SDR: 222.64 - Will Report  
FGHI    EFG       2222.64    High SMS usage - VPMN: FGHI - SRC: EFG - SDR: 2222.64 - Will Report   
JKL     HIJK      222.64     High SMS usage - VPMN: JKL - SRC: HIJK - SDR: 222.64 - Will Report    
MNOPQR  LMN       22.64      High SMS usage - VPMN: MNOPQR - SRC: LMN - SDR: 22.64 - Will Report 

说明:内联视图(子查询)为我们提供了没有空格/空格的消息,以及原始消息文本。然后我们使用regexp_substr()来查找键值对,并使用replace()来删除“标签”(VPMN:,SRC:,SDR :)。 Dbfiddle here