简体   繁体   English

如何使用REGEXP_SUBSTR函数从字符串中提取子字符串?

[英]how to use the REGEXP_SUBSTR function to extract a substring from a string?

I need to extract the word and the sequence of words from the error log. 我需要从错误日志中提取单词和单词序列。

below log examples: 下面的日志示例:

2019.06.08 14:32:36 ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] [Teradata DBMS] : No more spool space in aload50.
2019.06.08 14:32:36 ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] [Teradata DBMS] : No more spool space in aload50. (ef)
2019.06.08 14:32:36 ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] [Teradata DBMS] : No more spool space in dload50.
2019.06.08 14:32:36 ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] [Teradata DBMS] : No more spool space in dload50. (ef)
message=[NCR] [Teradata DBMS] : No more spool space in aload50. (ef)
message=[NCR] [Teradata DBMS] : No more spool space in dload50. (ef)
message=[NCR] [Teradata DBMS] : No more spool space in aload50. (ee)
message=[NCR] [Teradata DBMS] : No more spool space in dload50. (ee)

I need to extract substring: 我需要提取子字符串:

error_log: error_log:

[Teradata DBMS] : No more spool space in aload50. [Teradata DBMS]:aload50中没有更多的后台处理空间。

without (eg) 没有(例如)

and username: for example: 和用户名:例如:

aload50 aload50

username can be: 用户名可以是:

aload01 to aload999 aload01至aload999

and

dload01 to dload999 dload01至dload999

select 
REGEXP_SUBSTR('2019.06.08 14:32:36  ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] error_message[Teradata DBMS] : No more spool space in aload50.',' regexp_for_error_log') AS error_log,
REGEXP_SUBSTR('2019.06.08 14:32:36  ERR 10298587    2019-06-07  PROJECT_NAME    script.sql  4483    2646 HY000 [NCR] [Teradata DBMS] : No more spool space in aload50.',' regexp_for_user_name') AS user_name,
FROM DUAL;

We can try using REGEXP_REPLACE here with a capture group: 我们可以在这里尝试使用REGEXP_REPLACE和捕获组:

SELECT
    REGEXP_REPLACE(log, '.*(\[Teradata DBMS\] : .* [^.]+)\..*', '\1') AS error_log,
    REGEXP_REPLACE(log, '.*\[Teradata DBMS\] : .* ([^.]+)\..*', '\1') AS user_name
FROM yourTable;

Demo 演示版

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM