Sql 如何使用REGEXP_SUBSTR函数从字符串中提取子字符串?
我需要从错误日志中提取单词和单词序列 以下是日志示例:Sql 如何使用REGEXP_SUBSTR函数从字符串中提取子字符串?,sql,regex,teradata,Sql,Regex,Teradata,我需要从错误日志中提取单词和单词序列 以下是日志示例: 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.
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;
我们可以尝试在此处使用
REGEXP\u REPLACE
来替换捕获组:
SELECT
REGEXP_REPLACE(log, '.*(\[Teradata DBMS\] : .* [^.]+)\..*', '\1') AS error_log,
REGEXP_REPLACE(log, '.*\[Teradata DBMS\] : .* ([^.]+)\..*', '\1') AS user_name
FROM yourTable;
我们可以在这里尝试使用
REGEXP\u REPLACE
和一个捕获组:
SELECT
REGEXP_REPLACE(log, '.*(\[Teradata DBMS\] : .* [^.]+)\..*', '\1') AS error_log,
REGEXP_REPLACE(log, '.*\[Teradata DBMS\] : .* ([^.]+)\..*', '\1') AS user_name
FROM yourTable;
您在这里期望的确切输出是什么?@jarlh databaseoracle@TimBiegeleisen错误日志:[Teradata DBMS]:aload50用户名中没有更多的假脱机空间:aload50@dnoeth我用。我在Oracle上的Teradata上有ETL处理错误的日志。您在这里期望的确切输出是什么?@jarlh databaseoracle@TimBiegeleisen错误日志:[Teradata DBMS]:aload50用户名中没有更多的假脱机空间:aload50@dnoeth我用。我在Oracle上的Teradata上有ETL处理错误的日志。你说得对。我做错了什么。非常感谢。:)@MartinusP不,我做错了,一开始我没有测试代码。很高兴帮助您:-)hi@Tim Biegeleisen您知道如何从字符串:“[Teradata DBMS]:aload50中不再有假脱机空间。”获取用户名aload50?通过修改
REGEXP\u REPLACE(log'.\[Teradata DBMS\]:.*([^.]+)\..*,'\1')作为用户名
`您是在要求对regex进行解释还是其他什么?我需要一个解决方案,其中用户名的源是上一个解决方案REGEXP\u REPLACE(error\u log'.*(\[Teradata DBMS\]:.[^.+])中的error\u log列\..*','\1')作为用户名,即使用字符串[Teradata DBMS]:aload50中没有更多的假脱机空间。剪切用户名:ALOAD50你是对的。我做错了什么。非常感谢。:)@MartinusP不,我做错了,一开始我没有测试代码。很高兴帮助您:-)hi@Tim Biegeleisen您知道如何从字符串:“[Teradata DBMS]:aload50中不再有假脱机空间。”获取用户名aload50?通过修改REGEXP\u REPLACE(log'.\[Teradata DBMS\]:.*([^.]+)\..*,'\1')作为用户名
`您是在要求对regex进行解释还是其他什么?我需要一个解决方案,其中用户名的源是上一个解决方案REGEXP\u REPLACE(error\u log'.*(\[Teradata DBMS\]:.[^.+])中的error\u log列\..*','\1')作为用户名,即使用字符串[Teradata DBMS]:aload50中没有更多的假脱机空间。剪切用户名:aload50