目前我的表中有一个名为TEXT的列,其数据包含“高SMS使用率 - VPMN:XXXXX - SRC:XXX - SDR:XX.YY - 将报告”
通过使用带分隔符( - )的正则表达式,我可以分隔字符串,如附加的屏幕截图 但我想以这种方式 以下是我正在使用的查询。 请建议我如何使用正则表达式来获得我想要的输出。
答案 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。