사용 디비는 오라클 입니다. 의미만이라도 잘 전해드리겠습니다.
'|' 으로 이어져 있는 4개(A|B|C|D) 의 값들이 콤마(,) 로 또 구분되어 이어져 있습니다.
콤마로 이어진 값들은 없을수도 있고 콤마로 이어진 갯수가 많을 수도 있습니다.
일단 4개의 행을 예로 들어 봤습니다.
with temp as{
select 'A1|A2|A3|A4 , B1|B2|B3|B4 , C1|C2|C3|C4' str from dual
union all select 'F1|F2|F3|F4 , G1|G2|G3|G4' from dual
union all select 'H1|H2|H3|H4' from dual
union all select null from dual
}
위와 같은 경우 제가 하고 싶은 작업은 콤마로 이어진 값들중에서 '|' 이어진 첫번째, 두번째를 더해서 컬럼으로 만들고 싶습니다.
temp 를 select 하면서 아래 방식으로 나오게 하고 싶습니다.
select (A1 || B1 || C1) as col1 , (A2 || B2 || C2) as col2
(F1 || G1) as col1, (F2 || G2) as col2
(H1) as col1 , (H2) as col2
null as col1 , null as col2
from temp <==temp 행이 4개 이므로 위 처럼 나오게 하고 싶습니다.
계산의 예를 보이기 위해서 4줄의 설명을 드렸습니다.
콤마로 이어진 컬럼에 데이타가 10개라면 (A1 || B1 || C1 ....|| J1) as col1, (A2 || B2 ||C2 .... ||J2 ) as col2 이렇게 됩니다.
WITH temp AS ( SELECT 'A1|A2|A3|A4 , B1|B2|B3|B4 , C1|C2|C3|C4' str FROM dual UNION ALL SELECT 'F1|F2|F3|F4 , G1|G2|G3|G4' FROM dual UNION ALL SELECT 'H1|H2|H3|H4' FROM dual UNION ALL SELECT null FROM dual ) SELECT rn, str , LISTAGG(REGEXP_SUBSTR(v, '[^|]+', 1, 1)) WITHIN GROUP(ORDER BY lv) v1 , LISTAGG(REGEXP_SUBSTR(v, '[^|]+', 1, 2)) WITHIN GROUP(ORDER BY lv) v2 FROM (SELECT rn, str , REGEXP_SUBSTR(str, '[^, ]+', 1, lv) v FROM (SELECT ROWNUM rn, str FROM temp) , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv(+) <= REGEXP_COUNT(str, '[^, ]+') ) GROUP BY rn, str ;