구분자 포함 값을 행으로 분리해보자.
10.1 이전 버전까지는 아래와 같이 SUBSTR 함수를 사용해야 한다.
-- 1 WITH w1 AS (SELECT 'A,BB,CCC,DDDD,EEEEE' AS c1 FROM DUAL) SELECT c1, SUBSTR (c1_n , INSTR (c1_n, ',', 1, LEVEL) + 1 , INSTR (c1_n, ',', 1, LEVEL + 1) - INSTR (c1_n, ',', 1, LEVEL) - 1) AS c1_n FROM (SELECT c1, ',' || c1 || ',' AS c1_n FROM w1) CONNECT BY LEVEL <= LENGTH (c1_n) - LENGTH (REPLACE (c1_n, ',')) - 1; C1 C1_N ------------------- ----- A,BB,CCC,DDDD,EEEEE A A,BB,CCC,DDDD,EEEEE BB A,BB,CCC,DDDD,EEEEE CCC A,BB,CCC,DDDD,EEEEE DDDD A,BB,CCC,DDDD,EEEEE EEEEE 5 행이 선택되었습니다.
11.1 버전부터 아래와 같이 정규 표현식 함수를 사용할 수 있다.
WITH w1 AS (SELECT 'A,BB,CCC,DDDD,EEEEE' AS c1 FROM DUAL) SELECT c1, REGEXP_SUBSTR (c1, '[^,]+', 1, LEVEL) AS c1_n FROM w1 CONNECT BY LEVEL <= REGEXP_COUNT (c1, ',') + 1; C1 C1_N ------------------- ----- A,BB,CCC,DDDD,EEEEE A A,BB,CCC,DDDD,EEEEE BB A,BB,CCC,DDDD,EEEEE CCC A,BB,CCC,DDDD,EEEEE DDDD A,BB,CCC,DDDD,EEEEE EEEEE 5 행이 선택되었습니다.
문자열에 포함된 구분자의 개수는 아래의 방식으로 계산할 수 있다.
WITH w1 AS (SELECT 'A,BB,CCC,DDDD,EEEEE' AS c1 FROM DUAL) SELECT c1 , LENGTH (c1) - LENGTH (REPLACE (c1, ',')) AS c2 , LENGTH (TRANSLATE (c1, ',' || c1, ',')) AS c3 , REGEXP_COUNT (c1, ',') AS c4 FROM w1; C1 C2 C3 C4 ------------------- -- -- -- A,BB,CCC,DDDD,EEEEE 4 4 4 1개의 행이 선택되었습니다.
'Oracle > SQL' 카테고리의 다른 글
주민등록번호 마스킹 (0) | 2012.04.30 |
---|---|
다중 행을 문자열로 집계 (0) | 2012.04.16 |
연속된 공백을 하나의 공백으로 변경 (0) | 2012.04.12 |
연속 상승 구간 조회 (0) | 2012.04.10 |
점 이력을 선분 이력으로 전환 (0) | 2012.04.09 |