Oracle/SQL2012. 4. 13. 14:10

구분자 포함 값을 행으로 분리해보자.


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
Posted by 정희락_