안녕하세요. 테이블 항목중에 아래와 같은 항목이 있을경우 연속 번호인 경우는 -로 표시하고 싶습니다.
즉 아래에 예의 경우 1-4, 6-8, 10 이런식으로 sql 구문으로 가능할까요 ?
고수님들의 답변 부탁드립니다.
ex)
컬럼 A
1,2,3,4, 6,7,8,10
질문의 '1,2,3,4,6,7,8,10' 이 - 하나의 문자열인가요? - 8 개의 레코드인가요? 결과의 '1-4, 6-8, 10' 이 - 하나의 문자열인가요? - 3 개의 레코드인가요?
lead(), lag() 함수 이용하시면 될 듯 하네요
대충 뭐 이런식이겠네요. 찾아보면 방법은 많이 있을겁니다. 적당히 응용하심..
with t as ( select '1,2,3,4,6,7,8,10' p from dual ) select trim(replace(replace(wm_concat(p||x),',',''),'.',',')) from ( select p , case when p+1 = lead(p) over(partition by 1 order by p) and p-1 = lag(p) over(partition by 1 order by p) then 'x' when p+1 = lead(p) over(partition by 1 order by p) then '-' when lead(p) over(partition by 1 order by p) is null then ' ' else '.' end as x from ( select to_number( case when level = 1 then substr(p, 1,instr(p,',',1,level)-1) when level = length(p) - length(replace(p,',','')) + 1 then substr(p, instr(p,',',-1)+1) else substr(p, instr(p,',',1,level-1)+1, instr(p,',',1,level-1+1) - instr(p,',',1,level-1)-1) end) as p from t connect by level <= length(p) - length(replace(p,',','')) + 1 ) ) where x <> 'x'
마농닝 아래 부분은 하나의 컬럼 하나의 문자열로 생각하시면 됩니다.
감사합니다.
SELECT LISTAGG( MIN(x) || DECODE(COUNT(*), 1, '', '-'||MAX(x)), ', ' ) WITHIN GROUP (ORDER BY MAX(x)) Result FROM ( SELECT lv , TO_NUMBER(REGEXP_SUBSTR(v, '[^, ]+', 1, lv)) x FROM (SELECT '1,2,3,4, 6,7,8,10' v FROM dual) , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) WHERE lv <= REGEXP_COUNT(v, ',') + 1 ) GROUP BY x - lv ;