한 컬럼에 101000000001 이란 데이터가 있을때 1월/3월/12월 이런식으로 자릿수마다 월을 매겨서 데이터를 뽑아내고싶은데 0 1 161

by 십이장기 [SQL Query] [2020.06.02 20:06:50]


 

쿼리를 짜니까 제 초보적인 실력으론

 decode(substr(l데이터,1,1),'1','1월') ||    
              decode(substr(데이터,2,1),'1','2월') ||
              decode(substr(데이터,3,1),'1','3월') ||
              decode(substr(데이터,4,1),'1','4월') ||
              decode(substr(데이터,5,1),'1','5월') ||
              decode(substr(데이터,6,1),'1','6월') ||
              decode(substr(데이터,7,1),'1','7월') ||
              decode(substr(데이터,8,1),'1','8월') ||
              decode(substr(데이터,9,1),'1','9월') ||
              decode(substr데이터,10,1),'1','10월') ||
              decode(substr(데이터,11,1),'1','11월') ||
              decode(substr(데이터,12,1),'1','12월') 

이렇게 각 자리를 decode로 연결해서 하는 방벙밖에 안떠오르더라구요 ㅠ 그리고 각자릿수마다 /로 연결하고싶은데

혹시 더 좋은 방법이 있을까요?

by 마농 [2020.06.03 07:55:22]

1건의 자료만 추출하여 변경하는 것인지?
여러건의 자료에 동시 적용되어야 하는 것인지?

WITH t AS
(
SELECT 1 pk, '101000000001' v FROM dual
UNION ALL SELECT 2, '111111111111' FROM dual
)
SELECT pk
     , v
     , LISTAGG(DECODE(SUBSTR(v, lv, 1), '1', lv||'월'), '/') WITHIN GROUP(ORDER BY lv) x
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 12)
 GROUP BY pk, v
;
SELECT pk
     , v
     , SUBSTR( DECODE(SUBSTR(v,  1, 1), '1',  '/1월')
            || DECODE(SUBSTR(v,  2, 1), '1',  '/2월')
            || DECODE(SUBSTR(v,  3, 1), '1',  '/3월')
            || DECODE(SUBSTR(v,  4, 1), '1',  '/4월')
            || DECODE(SUBSTR(v,  5, 1), '1',  '/5월')
            || DECODE(SUBSTR(v,  6, 1), '1',  '/6월')
            || DECODE(SUBSTR(v,  7, 1), '1',  '/7월')
            || DECODE(SUBSTR(v,  8, 1), '1',  '/8월')
            || DECODE(SUBSTR(v,  9, 1), '1',  '/9월')
            || DECODE(SUBSTR(v, 10, 1), '1', '/10월')
            || DECODE(SUBSTR(v, 11, 1), '1', '/11월')
            || DECODE(SUBSTR(v, 12, 1), '1', '/12월')
             , 2) x
  FROM t
;

 

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