2017-04-19 14 views
3

구분 기호를 사용하여 문자열을 분할하는 것이 좋습니다.Oracle 11g regexp_substr 함수에서 두 구분 기호를 사용하여 문자열을 분할하는 방법

첫 번째 분할에 기반 구분하는 분할 할 문자열을 기반으로 나누해야 선택에 - 구분

내 원래 문자열 : UMC12I-1234,CSM3-123,VQ, 예상 출력 :

UMC12I 
CSM3 
VQ 

각 값은 행 값으로 제공

나는 옵션을 시도했다

WITH fab_sites AS (
    SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '[^,]+', 1, LEVEL)) fab_site 
    FROM dual 
    CONNECT BY LEVEL <= regexp_count('UMC12I-1234,CSM3-123,VQ,', '[^,]+')+1 
) 
SELECT fab_site FROM fab_sites WHERE fab_site IS NOT NULL 

-

출력 구분 기호를 기반으로 갈라진다는 다음과 같습니다

UMC12I-1234 
CSM3-123 
VQ 

어떻게 내 예상 출력을 얻을 수 있습니까? (다시 분할해야 - 구분 기호를)

답변

1

당신은 1 개보다 하나 또는 그 이상의 문자 다른 그룹에

([^,-]+)(-[^,-]+)? 

패턴이 일치하고 캡처를 사용하여 regexp_substr으로 - 전에 "단어"를 추출 할 수있다 ,- 인 경우 -의 선택적 시퀀스와 ,-이 아닌 1 이상의 char과 일치합니다.

regex demo을 참조하십시오.

위의 정규식 대신 당신의 사용이 regex_substr 라인 :

SELECT trim(regexp_substr('UMC12I-1234,CSM3-123,VQ,', '([^,-]+)(-[^,-]+)?', 1, LEVEL, NULL, 1)) fab_site 

당신은이 쿼리를 시도 할 수 online demo

+0

두 번째 링크에 문제가 생길 수 있습니다. ** 온라인 데모 ** –

+0

@ k-five : 달팽이 노트북에 입력하면 일반적으로 이러한 "오타"가 발생합니다. http://rextester.com/QBE60576이어야합니다. –

+0

Hi Wiktor, 그 일, 고맙습니다. – Chidam

1

참고 항목 :

WITH fab_sites AS (
     SELECT TRIM(',' FROM REGEXP_SUBSTR('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+', 1, LEVEL)) fab_site 
     FROM dual 
    CONNECT BY LEVEL <= REGEXP_COUNT('UMC12I-1234,CSM3-123,VQ,', '(^|,)[^,-]+') 
) 
SELECT fab_site 
    FROM fab_sites; 

우리는 어떤 문자열을 일치하여 시작하는 전체 문자열 ^의 시작 또는 구분 기호 인 쉼표 ,으로 시작합니다. 그런 다음 쉼표 나 대시와 일치하지 않는 모든 문자를 가져옵니다. -. 해당 하위 문자열이 있으면 나머지 쉼표를 삭제합니다.

P. 나는 +1CONNECT BY 절이 "외부"쿼리의 WHERE NOT NULL 인 것처럼 관계가 없다고 생각합니다.

+0

안녕 데이비드, 그 일, 고마워요. – Chidam