행열 변경 문의 0 4 1,923

by captain [2014.07.30 11:03:21]


안녕하세요

구분자로 구성되어 있는 여러 컬럼을 두개의 컬럼(컬럼명, 값)으로 나타내고자 합니다.

 

예를들면

필드a, 필드b, 필드c

 a;b;c   d;e;f    g;h

를 아래처럼 두개의 필드에 값을 넣고자 합니다.(세미콜론 구분자)

구분 값

필드a a
필드a b
필드a c
필드b d
필드b e
필드b f
필드c g
필드c h

 

감사합니다.

by 우리집아찌 [2014.07.30 12:56:42]

필드가 무한적으로 늘어나면서 하시려면 다이나믹 쿼리 하셔야합니다.

그외는 밑에 참조

http://www.gurubee.net/article/55512


by 우리집아찌 [2014.07.30 13:31:25]

아.. 반대로 이해했네요..


by 마농 [2014.07.30 13:07:57]
WITH t AS
(
SELECT 'a;b;c' f1, 'd;e;f' f2, 'g;h' f3 FROM dual
)
SELECT gb
     , REGEXP_SUBSTR(v, '[^;]+', 1, lv) v
  FROM t
 UNPIVOT (v FOR gb IN (f1, f2, f3)) a
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9) b
 WHERE lv <= REGEXP_COUNT(v, ';') + 1
 ORDER BY gb, lv
;

 


by 마농 [2014.07.30 15:36:30]
WITH t AS
(
SELECT 'a;b;c' f1, 'd;e;f' f2, 'g;h' f3 FROM dual
)
SELECT gb
     , REGEXP_SUBSTR(v, '[^;]+', 1, lv) v
  FROM (SELECT DECODE(lv, 1, 'F1', 2, 'F2', 3, 'F3') gb
             , DECODE(lv, 1,  f1 , 2,  f2 , 3,  f3 ) v
          FROM t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 3)
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= LENGTH(v) - LENGTH(REPLACE(v, ';')) + 1
 ORDER BY gb, lv
;

 

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