在sql中两个单词之间提取带有正则表达式的文本

Extract text with regex between two words in sql

提问人:Almosino 提问时间:11/13/2023 最后编辑:Wiktor StribiżewAlmosino 更新时间:11/14/2023 访问量:58

问:

我有一个名为 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 的列,其中包含错误代码和一个包含第一个 ORA 和第二个 ORA 之间消息的Error_message。

预期成果:

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  


SQL 字符串 oracle

评论

1赞 Wiktor Stribiżew 11/13/2023
或?REGEXP_SUBSTR(message, 'ORA-[0-9]+: (.*?)(ORA|$)', 1, 1, 'n', 1)
1赞 Almosino 11/14/2023
它在所有情况下都按预期工作!
0赞 Wiktor Stribiżew 11/14/2023
但我想每个人都认为你需要一种非正则表达式的方法

答:

2赞 Littlefoot 11/13/2023 #1

如果它不必是正则表达式解决方案,则旧组合在大型数据集上的性能会更好。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>
0赞 Barbaros Özhan 11/13/2023 #2

您可以从 [^: ] 的最后一次出现开始,然后取部分直到结尾 +$,例如

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

前提是该列的数据模型在整个表中相同

0赞 Reilas 11/14/2023 #3

这是一个参考。

对于Error_Code,请使用匹配模式

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

而且,为了Error_Message,请使用捕获模式

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

评论

0赞 astentx 11/14/2023
Oracle 不支持环理。