DB/Oracle

Split처럼 특정 구분자를 기준으로 열에서 행으로 변환 (Oracle)

밍꿔 2020. 7. 27. 18:21


반응형

 

 

오라클에서 위의 내용 처럼 한 컬럼에 특정 구분자(ex ',' , '/' 등등)로 구분하여 데이터를 관리하는 경우가

 

종종 있다. (개인적으론 테이블 설계가 잘못 되었다고 생각됨)

 

아래의 쿼리 형태로 행으로 구분해서 표현 가능 하다.

 

SELECT 			
	T.ID 			
	,REGEXP_SUBSTR(T.VALUE, '[^,]+', 1, Level) AS VALUE 			
	,T.REG_DATE 		
FROM (
	SELECT 1 AS ID, '테스트1,테스트2,테스트3' AS VALUE, '2020-07-27 13:30:00' AS REG_DATE FROM DUAL
		UNION ALL
	SELECT 2 AS ID, '테스트4,테스트5' AS VALUE, '2020-07-27 14:40:00' AS REG_DATE FROM DUAL
		UNION ALL
	SELECT 3 AS ID, '테스트6,테스트7,테스트8,테스트9' AS VALUE, '2020-07-27 15:50:00' AS REG_DATE FROM DUAL
)T 		
WHERE T.VALUE IS NOT NULL 		
CONNECT BY LEVEL <= REGEXP_COUNT(T.VALUE, '[^,]+') 		
AND PRIOR T.ID  = T.ID 		
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL

 

변환 후, 아래와 같이 조회 가능.

 

 

 

추가로,

SELECT 
	REGEXP_SUBSTR('AAA,BBB,CCC,DDD','[^,]+', 1, LEVEL) 
FROM DUAL
CONNECT BY REGEXP_SUBSTR('AAA,BBB,CCC,DDD', '[^,]+', 1, LEVEL) IS NOT NULL

 

위의 쿼리는 첫 번째 쿼리 보다 간결하지만, 성능상의 이슈가 있어 첫 번째 쿼리로 진행 함.

 

 

반응형