코딩

[SQL] 오라클 구분자로 행열 변환(UNPIVOT, LEVEL)

ZER01 2025. 2. 7. 20:19

 

데이터 저장 시 한필드에 구분자로 저장했을때 구분자를 이용해 행열 변환하는 방법입니다.

1. 모든 데이터가 같은 구분자 수로 저장되는 경우는 regexp_substr과 UNPIVOT을 이용해서 처리할 수 있습니다.

 

SELECT * FROM (
    SELECT temp_date
        , REGEXP_SUBSTR(temp_num, '[^,]+', 1, 1) AS num1
        , REGEXP_SUBSTR(temp_num, '[^,]+', 1, 2) AS num2
        , REGEXP_SUBSTR(temp_num, '[^,]+', 1, 3) AS num3
        , REGEXP_SUBSTR(temp_num, '[^,]+', 1, 4) AS num4
    FROM (
        SELECT '날짜1' AS temp_date
            , '111,222,333,444' AS temp_num
        FROM DUAL
        UNION ALL
        SELECT '날짜2' AS temp_date
            , '123,234,345,456' AS temp_num
        FROM DUAL
    )
) UNPIVOT(un_pi_num FOR num IN(num1,num2,num3,num4));

 

2. 데이터 내 구분자 수가 정해져있지 않을 경우는 LEVEL을 이용해서 처리할 수 있습니다.

 

SELECT DISTINCT temp_date
    , REGEXP_SUBSTR(temp_num, '[^,]+', 1, LEVEL) AS temp_num
FROM (
    SELECT '날짜1' AS temp_date
        , '111,222,333,444,555' AS temp_num
    FROM DUAL
    UNION ALL
    SELECT '날짜2' AS temp_date
        , '123,234,345,456' AS temp_num
    FROM DUAL
) A
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(temp_num, '[^,]+',''))+1
ORDER BY temp_date, temp_num