我有日志表:
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得到结果吗?
发布于 2016-04-26 21:19:50
这个问题出现在“相关”一节中,尽管这是一个老问题,但它仍然是相关的,值得回答。恐怕原来的海报是不正确的,因为他的代码不工作良好,但返回无效的结果。他的示例返回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>https://stackoverflow.com/questions/23158121
复制相似问题