이중 split 은 어떻게 처리해야 하는지요 ? 0 1 110

by 열심히 [SQL Query] [2018.11.08 21:56:54]


사용 디비는 오라클 입니다. 의미만이라도 잘  전해드리겠습니다.

'|' 으로 이어져 있는 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 이렇게 됩니다.

by 마농 [2018.11.09 10:40:18]
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
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입