Как использовать функцию REGEXP_SUBSTR для извлечения подстроки из строки? - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно извлечь слово и последовательность слов из журнала ошибок.

ниже примеры журналов:

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)

Мне нужно извлечь подстроку:

error_log:

[СУБД Teradata]: в aload50 больше нет места в буфере.

без (например)

и имя пользователя: например:

aload50

имя пользователя может быть:

от 01 до 999

и

от 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;

1 Ответ

2 голосов
/ 12 июня 2019

Мы можем попробовать использовать REGEXP_REPLACE здесь с группой захвата:

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

Демо

...