로그 테이블이 있습니다.
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 로만 결과를 얻을 수 있습니까 ?
이 질문은 "관련"섹션에 나타 났으며 이전 질문 임에도 불구하고 여전히 관련성이 있으며 답변 할 가치가 있습니다. 코드가 제대로 작동하지 않지만 잘못된 결과를 반환하기 때문에 원본 포스터가 잘못된 것 같습니다. 그의 예에서는 대괄호로 둘러싸인 6 개의 값만있는 14 개의 행을 반환합니다. 다음은 일치 된 패턴 뒤에 줄 끝이 올 때를 허용하고 증명을 위해 행 번호와 일치 번호를 표시하는 정규식의 예입니다. 이것이 미래의 검색 자에게 도움이되기를 바랍니다.
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>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다