칼럼의 특정 문자(/)를 기준으로 레코드 복제 0 4 1,041

by 도겸아빠 [SQL Query] [2013.01.21 17:56:48]


또 질문을 올리게되었습니다.

ROUTE                A          B 
-----------------------------------------------------------------------------------------------------
ICN/DXB/OSL      100      200 --> 레코드가 아래와 같이 2개로 복제
DXB 100 200
OSL 100 200
ICN/BKK/SGN     200      300 --> 레코드가 아래와 같이 2개로 복제
BKK 200 300
SGN 200 300
ICN/NVI/AMS      300      400 --> 레코드가 아래와 같이 2개로 복제
NVI 300 400
AMS 300 400

요즘들어 계속 이런 쿼리만 부닥치게되네요..
첫번째 /앞의것은 무시합니다.....
도움의 손길 부탁드립니다.

즐거운 저녁되세요^^
by 제로 [2013.01.21 18:34:25]
 
-- Sort 기준이 없기에 rownum 으로 임의의 sort 기준을 적용하였습니다.
with t as
( select 'ICN/DXB/OSL' route, 100 a, 200 b from dual union all
 select 'ICN/BKK/SGN', 200, 300 from dual union all
 select 'ICN/NVI/AMS', 300, 400 from dual
)
select regexp_substr(route, '[^/]+', 1, lv+1) route
   , a
   , b
from (select t.*, rownum as sort from t)
  , (select level lv from dual connect by level <=2)
order by sort  
;

by 아린 [2013.01.21 18:40:04]
  -- 복제된 원 row 로 같이 출력
WITH t(ROUTE, A, B) AS( 
SELECT 'ICN/DXB/OSL', 100, 200 FROM dual UNION ALL
SELECT 'ICN/BKK/SGN', 200, 300 FROM dual UNION ALL
SELECT 'ICN/NVI/AMS', 300, 400 FROM dual
)
SELECT NVL(REGEXP_SUBSTR(route, '[^/]+', 1, lv+1), route) routes, a, b 
  FROM t, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)  
ORDER BY route, DECODE(lv, 3, 0, lv)

by 손님 [2013.01.21 18:40:55]
with t as (
select 'ICN/DXB/OSL' x,   100 y,   200 z from dual union all
select 'ICN/BKK/SGN',   200,   300 from dual union all 
select 'ICN/NVI/AMS',   300,   400 from dual 
)
select x,y,z
   , regexp_substr(x, '[^/]+', 1, b.lv + 1) val
 from t a,
   (select level lv from dual connect by level <=99) b
 where b.lv <= regexp_count(x, '/')
 order by x, lv

by 도겸아빠 [2013.01.22 09:06:21]
다들 정말 대단하십니다.
이렇게 답변이 많이 달릴줄 몰랐습니다.
답변 채택은 다른분께는 죄송하지만 첫번째 분께 드렸습니다.
답변 주셔서 감사합니다.&^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입