전체/Oracle
오라클 column to row (컬럼의 데이터를 여러개의 row로 가져오기)
effortDev
2020. 2. 26. 14:15
- 컬럼을 여러개의 로우로 표현하기
테이블의 데이터를 보면 한 컬럼안의 구분자를 사용하여 여러개의 데이터를 저장하여 사용하는 테이블이 있다.
1 | SELECT '02,031,032' LIST_COL FROM DUAL | cs |
1 2 3 4 | │ LIST_COL │ │───────────────│ │ 02,031,032 │ └───────────────┘ | cs |
현재 LIST_COL 컬럼에는 한 컬럼안에 데이터가 ,(콤마)로 구분되어 코드값이 저장되어 있다.
1개의 로우로 표현된 컬럼 값을 ,(콤마)로 데이터를 분리하여 여러개의 ROW로 표현해보겠다.
1. , (콤마)로 구분되어 코드값을 여러개의 ROW로 추출하기
1 2 3 4 | WITH LIST_TXT AS (SELECT '02,031,032' LIST_COL FROM DUAL) SELECT TRIM(REGEXP_SUBSTR(LIST_COL,'[^,]+',1,LEVEL)) AS LIST_TO_ROW FROM LIST_TXT CONNECT BY INSTR(LIST_COL, ',' , 1, LEVEL - 1 ) > 0 | cs |
1 2 3 | SELECT TRIM(REGEXP_SUBSTR('02,031,032','[^,]+',1,LEVEL)) AS LIST_TO_ROW FROM DUAL CONNECT BY INSTR('02,031,032', ',', 1, LEVEL-1 ) > 0 | cs |
[결과]
1 2 3 4 5 6 7 8 | │ LIST_TO_ROW │ │───────────────│ │ 02 │ ├───────────────┤ │ 031 │ ├───────────────┤ │ 032 │ └───────────────┘ | cs |
이렇게 사용하면 여러개의 테이블에 필요한 데이터를 추출하고 싶을때 SUBQUERY를 사용하여 뽑아낼수 있다.
2. 응용하기 ( 데이터 리스트를 row로 표현하여 해당 데이터만 뽑아내기 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SELECT A.REGION , A.AREA_CODE , B.RESIDENCE_NAME FROM ( SELECT '000' AS P_CODE,'서울' AS REGION, '02' AREA_CODE FROM DUAL UNION ALL SELECT '000' AS P_CODE, '경기' AS REGION, '031' AREA_CODE FROM DUAL UNION ALL SELECT '000' AS P_CODE, '인천' AS REGION, '032' AREA_CODE FROM DUAL UNION ALL SELECT '000' AS P_CODE, '강원' AS REGION, '033' AREA_CODE FROM DUAL UNION ALL SELECT '000' AS P_CODE, '부산' AS REGION, '051' AREA_CODE FROM DUAL ) A INNER JOIN ( SELECT '000' AS P_CODE, '조현영' AS RESIDENCE_NAME, '02,031,032' AS AREA_CODE_LIST FROM DUAL ) B ON A.P_CODE = B.P_CODE WHERE A.AREA_CODE IN( SELECT TRIM(REGEXP_SUBSTR(B.AREA_CODE_LIST,'[^,]+',1,LEVEL)) AS LIST_TO_ROW FROM DUAL CONNECT BY INSTR(B.AREA_CODE_LIST, ',', 1, LEVEL-1 ) > 0 ) | cs |
임시로 A, B 테이블 데이터를 정의하고
A테이블에는 지역과 지역번호 데이터가 있고
B테이블에는 지역번호 데이터가 ,(콤마)로 구분되어 여러개 들어가 있다.
[A 테이블]
1 2 3 4 5 6 | P_CODE REGION AREA_CODE 000 │ 서울 │ 02 │ 000 │ 경기 │ 031 │ 000 │ 인천 │ 032 │ 000 │ 강원 │ 033 │ 000 │ 부산 │ 051 │ | cs |
[B 테이블]
1 2 | P_CODE RESIDENCE_NAME AREA_CODE_LIST 000 │ 조현영 │ 02,031,032 │ | cs |
A테이블과 B테이블을 조인하여
조현영의 지역번호에 해당하는 지역명을 추출하려면 REGEXP_SUBSTR 정규식을 사용해
한 컬럼에 저장된 리스트를 여러개의 row로 변환하여
in 조건절 안에 해당하는 데이터만 추출할 수 있는 것을 확인할 수 있다.
[결과]
1 2 3 4 | REGION AREA_CODE RESIDENCE_NAME 서울 │ 02 │ 조현영 │ 경기 │ 031 │ 조현영 │ 인천 │ 032 │ 조현영 │ | cs |