【问题标题】:how to use the REGEXP_SUBSTR function to extract a substring from a string?如何使用 REGEXP_SUBSTR 函数从字符串中提取子字符串?
【发布时间】:2019-10-26 15:55:27
【问题描述】:

我需要从错误日志中提取单词和单词序列。

以下日志示例:

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)

我需要提取子字符串:

错误日志:

[Teradata DBMS]:aload50 中没有更多的假脱机空间。

没有(例如)

和用户名: 例如:

加载50

用户名可以是:

aload01 到 aload999

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;

【问题讨论】:

  • 您期望的 exact 输出是什么?
  • @jarlh 数据库 oracle
  • @TimBiegeleisen error_log:[Teradata DBMS]:aload50 中没有更多的假脱机空间用户名:aload50
  • @dnoeth 我使用。我在 Oracle 上的 Teradata 上的 ETL 处理错误日志。

标签: sql regex teradata


【解决方案1】:

我们可以在这里尝试使用REGEXP_REPLACE 与捕获组:

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

Demo

【讨论】:

  • 你是对的。我做错事情了。非常感谢。 :)
  • @MartinusP 不,我做错了什么,我一开始没有测试代码。很高兴帮助你:-)
  • 嗨@Tim Biegeleisen,你知道如何从字符串中获得:“[Teradata DBMS]:aload50 中没有更多的假脱机空间。”获取用户名 aload50 ?通过修改REGEXP_REPLACE(log, '.*\[Teradata DBMS\] : .* ([^.]+)\..*', '\1') AS user_name`
  • 您是要解释正则表达式还是其他什么?
  • 我需要一个解决方案,其中 user_name 的来源是上一个解决方案 REGEXP_REPLACE(error_log, '.*(\[Teradata DBMS\] : .* [^.]+)\..*', '\1') as user_name 中的 error_log 列,即使用字符串 [Teradata DBMS]:aload50 中没有更多的假脱机空间。剪切用户名:aload50
猜你喜欢
  • 2022-01-19
  • 2012-06-26
  • 1970-01-01
  • 2021-08-04
  • 2011-11-17
  • 1970-01-01
  • 2011-01-19
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多