2016-07-06 3 views
0

안녕 다음 샘플 문자열이 있습니다.오라클의 REGEXP_INSTR을 기준으로 문자열에서 여러 값을 추출하십시오.

'청구 번호 : 299765Member : JOHNSON, XYZ 서비스 라인 번호 1 개
액션 코드 0 응답 지침 1641800532 상담 전화 2 서비스 라인에
번호 2 액션 코드 0 응답 지침 400 프로 시저 코드
4805587'

전체 문자열에서 확인 된 Response Directive String이있을 때 Response Directive 문자열 다음에 값을 추출해야합니다.

WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,1,'i',1) as  
NUM_VAL 
FROM TEST; 

은 지금은 내가

NUM_VAL를 작성 위의 질의

1641800532

예상 결과 설정

NUM_VAL

를 기반으로 하나의 결과를 초래하고있다

400

1641800532

친절하게 여러 번에 대한 도움말을 표시합니다. 고마워요

+0

"FROM dual;"이 (가) 변경되었습니다. "FROM TEST;" 코드의 마지막 줄 (외부 쿼리는 이중에서 선택하지 않음)에서 sqldeveloper 태그를 제거하여 문제와 아무 관련이 없습니다. 질문 : 당신의 정규 표현식에서'지시어'의 끝 부분에 + 표시가 나타나는 이유는 무엇입니까? 즉,'directive'라는 말의 끝에'e' 문자가 하나 이상 나타날 수 있습니다. 그런 뜻이 아니라면 직접 소식을 수정하고 삭제할 수 있습니다. 묻지 않고 너를 위해 그것을하고 싶지 않았다. – mathguy

답변

0

두 가지 쉬운 방법이 있습니다.

A),이 방법에서는

을 지원하는 입력 데이터가 50 배라고 복제하고, 제 2 발생에 대해, 1 발생을 2 중복 1 중복을 검색하는 것이 가능 사건들의 최대 수를 결정 등

입력 데이터에없는 모든 항목은 null이므로 WHERE 절에서 필터링해야합니다. 이 버전은 발생의 수를 지원하고 만에 데이터를 50 번 중복되지 않기 때문에 더 나은 수행해야

WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
), 
occurrences AS (SELECT rownum occurrence# FROM dual connect by -- Max 50 occurrences supported 
rownum <= 50) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) as  
NUM_VAL 
FROM test cross join occurrences 
WHERE regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) IS NOT NULL; 

B) 이상에서만 오라클 12C에서 작동하거나 (A LATERAL 인라인 뷰를 사용) 하나 또는 두 개의 일치를 찾으십시오. 불행히도 11g에서는 작동하지 않습니다. 나는 완전성을 위해서만 그것을 포함하고있다. 표준 connect by level 쿼리를 사용

-- 12c version 
WITH TEST AS(
SELECT 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1     
Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line   
Number 2 Action Code 0 Response Directive 400 Procedure Code 
4805587' 
AS NOTE_TEXT FROM DUAL 
) 
SELECT regexp_substr(NOTE_TEXT,'response directive+\s+(\w+)',1,occurrences.occurrence#,'i',1) as  
NUM_VAL 
FROM test cross join lateral (SELECT rownum occurrence# FROM dual connect by -- Max 50 occurrences supported 
rownum <= regexp_count(note_text, 'response directive+\s+(\w+)',1,'i')) occurrences 
; 

0

:

with 
    test (note_text) as (
     select 'Claim Number: 299765Member: JOHNSON,XYZ Service Line Number 1 
       Action Code 0 Response Directive 1641800532 Advice Line 2 Service Line 
       Number 2 Action Code 0 Response Directive 400 Procedure Code 
       4805587' 
     from dual 
    ) 
select level as lvl, 
     regexp_substr(note_text,'response directive (\d+)', 1, level, 'i', 1) as num_val 
from test 
connect by level <= regexp_count(note_text, 'response directive \d+', 1, 'i') 
order by lvl; 

출력 :

LVL NUM_VAL 
----- ---------- 
    1 1641800532 
    2 400 

2 rows selected. 

이는 "응답 지시어를"다음 번호를 잡을 것입니다. 실제로 의미가있는 경우 (\d+ 대신)으로 다시 변경할 수 있습니다.또한 "responsive directive"다음에 정확히 하나의 공간을 허용합니다. 원할 경우 \s+으로 다시 변경할 수 있습니다.

+0

이 질문에 대한 답을했지만'test'에는 한 행만 있다고 가정하고 있습니다. –

관련 문제