oracle中的REGEXP_SUBSTR

时间:2014-04-18 16:25:22

标签: oracle


我有日志表:

with t as
 (select '16/04/2014  20:17:25 XXX. Xxxxxxx xxx xxx   [SYSTEM_JOBS] xxx [POSTPONE_JOBS] xxx [SYSTEM] xxxx [JOB2]' col
    from dual
 UNION ALL
 select '16/04/2014  20:17:25 XXX. Xxxxxxx   [SYSTEM_JOBS] xxx [POSTPONE_JOBS]' col
    from dual)
select * from t


我试图在' ['和']'包含 []。
我的版本:

select regexp_substr(col, '(\[.*?\])', 1, level) col_substr,
       regexp_replace(regexp_substr(col, '(\[.*?\])', 1, level),
                      '(\[|])',
                      '') col_replace_substr
  from t
CONNECT BY regexp_substr(col, '(\[.*?\])', 1, level) is not null


我的版本运行良好,但我需要获得没有函数的结果 regexp_replace ,我想在我的代码中使用一个函数。 我可以仅使用 REGEXP_SUBSTR 获得结果吗?

1 个答案:

答案 0 :(得分:0)

这个问题出现在“相关”部分,即使它是一个老问题,它仍然是相关的,值得回答。我担心原始海报不正确,因为他的代码不能正常工作但会返回无效结果。他的示例返回14行,其中只有6个值被方括号括起来。下面是一个带有正则表达式的示例,该示例允许匹配的模式后跟行的末尾,并且还显示行号和匹配号以进行证明。我希望这有助于未来的搜索者:

SQL> with t(rownbr, col1) as (
    select 1, '16/04/2014  20:17:25 XXX. Xxxxxxx xxx xxx   [SYSTEM_JOBS] xxx [POSTPONE_JOBS] xxx [SYSTEM] xxxx [JOB2]' from dual
    UNION
    select 2, '16/04/2014  20:17:25 XXX. Xxxxxxx   [SYSTEM_JOBS] xxx [POSTPONE_JOBS]' from dual
   )
   SELECT rownbr, column_value match_number,
          regexp_substr(col1,'(\[.*?\])( |$)', 1, column_value, NULL, 1) col_substr,
          regexp_substr(col1,'\[(.*?)\]( |$)', 1, column_value, NULL, 1) col_replace_substr
     FROM t,
          TABLE(
            CAST(
              MULTISET(SELECT LEVEL
                          FROM dual
                          CONNECT BY LEVEL <= REGEXP_COUNT(col1, '\[.*?\]')
                      ) AS sys.OdciNumberList
            )
          )
    WHERE regexp_substr(col1,'(\[.*?\])( |$)', 1, column_value, NULL, 1) IS NOT NULL;

    ROWNBR MATCH_NUMBER COL_SUBSTR           COL_REPLACE_SUBSTR
---------- ------------ -------------------- --------------------
         1            1 [SYSTEM_JOBS]        SYSTEM_JOBS
         1            2 [POSTPONE_JOBS]      POSTPONE_JOBS
         1            3 [SYSTEM]             SYSTEM
         1            4 [JOB2]               JOB2
         2            1 [SYSTEM_JOBS]        SYSTEM_JOBS
         2            2 [POSTPONE_JOBS]      POSTPONE_JOBS

6 rows selected.

SQL>