我有日志表:
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 获得结果吗?
答案 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>