oracle 在SQL中的两个单词之间使用正则表达式提取文本

cnh2zyt3  于 2023-11-17  发布在  Oracle
关注(0)|答案(3)|浏览(131)

我有一个名为TABLE的表,其中有一个名为MESSAGE的列。该列具有以下值:

returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXTORA-06512
returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXT1ORA-O6512
returning: -1 -> java.sql.SQLException: ORA-01403: NO data availableORA-06512
returning: -1 -> java.sql.SQLException: ORA-20001: errorORA-06512

字符串
我想使用一个Oracle sql查询来解析数据,并获得一个名为Error_code的列,其中包含错误代码,以及一个Error_message,其中包含第一个ORA和第二个ORA之间的消息。
预期结果:

Error_code  Error_message
ORA-20000   SAMPLETEXT
ORA-20000   SAMPLETEXT1
ORA-01403   NO data available
ORA-20001:  error


我使用了以下查询:

SELECT 
    REGEXP_SUBSTR(message, 'ORA-[0-9]+') AS Error_Code,
    REGEXP_SUBSTR(message, '(?<=ORA-[0-9]+: ).*(?<=ORA)', 1, 1, 'n') AS Error_Message
FROM TABLE


返回结果:

Error_code  Error_message
ORA-20000   
ORA-20000   
ORA-01403   
ORA-20001

ddarikpa

ddarikpa1#

如果它不一定是正则表达式解决方案,旧的substr + instr组合在大型数据集上会表现得更好。
样本数据:

SQL> with test (col) as
  2    (select 'returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXTORA-06512' from dual union all
  3     select 'returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXT1ORA-O6512' from dual union all
  4     select 'returning: -1 -> java.sql.SQLException: ORA-01403: NO data availableORA-06512' from dual union all
  5     select 'returning: -1 -> java.sql.SQLException: ORA-20001: errorORA-06512' from dual
  6    )

字符串
查询:

7  select col,
  8    substr(col, instr(col, 'ORA', 1, 1),
  9                instr(col, 'ORA', 1, 2) - instr(col, 'ORA', 1, 1)
 10          ) result
 11  from test;

COL                                                                           RESULT
----------------------------------------------------------------------------- ------------------------------
returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXTORA-06512        ORA-20000: SAMPLETEXT
returning: -1 -> java.sql.SQLException: ORA-20000: SAMPLETEXT1ORA-O6512       ORA-20000: SAMPLETEXT1
returning: -1 -> java.sql.SQLException: ORA-01403: NO data availableORA-06512 ORA-01403: NO data available
returning: -1 -> java.sql.SQLException: ORA-20001: errorORA-06512             ORA-20001: error

SQL>

ewm0tg9j

ewm0tg9j2#

您可以从**:的最后一次出现开始,到[^: ],并将部分取到最后+$**,例如

SELECT REGEXP_SUBSTR(message, 'ORA-[0-9]+') AS Error_Code,
       REGEXP_SUBSTR(message, '([^: ])+$') AS Error_Message
  FROM "TABLE"

字符串
如果列的数据模型在整个表中相同,

2nbm6dog

2nbm6dog3#

这是一个参考。
对于 Error_Code,使用 match pattern

(?=ORA-\d+).+?(?=:)

字符串
对于 Error_Message,使用 capture pattern

ORA-\d+:\s+(.+)ORA

相关问题