database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38284 게시물 읽기
No. 38284
START WITH... CONNECT BY 로 연결시킨 구문에서 특정값을 뽑아오고 싶습니다.
작성자
전현욱(halmac)
작성일
2010-12-31 11:41
조회수
4,462

문득 이런 기능도 있지 않을까 하는 생각에 질문드립니다.

 

START WITH... CONNECT BY 로 연결시킨 구문에서

SYS_CONNECT_BY_PATH를 통해서 값을 가져오는건 많이 해봤는데...

혹시 연결된 값중 특정 레벨의 값을 뽑는다거나... 특정 조건의 값을 뽑는 것이 가능한가요??

 

당췌 말로 써서는 저도 이해 못할꺼 같아서...

WITH TABLE_A AS (
SELECT  1 AS NUM, 'VALUE1' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  2 AS NUM, 'VALUE2' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  3 AS NUM, 'VALUE3' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  4 AS NUM, 'VALUE4' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  5 AS NUM, 'VALUE5' AS VALUE, '0002' AS CODE FROM DUAL UNION ALL
SELECT  6 AS NUM, 'VALUE6' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  7 AS NUM, 'VALUE7' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  8 AS NUM, 'VALUE8' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  9 AS NUM, 'VALUE9' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  10 AS NUM, 'VALUE10' AS VALUE, '0001' AS CODE FROM DUAL
)
SELECT  SYS_CONNECT_BY_PATH(NUM, ' > ') AS PATH_NUM
      , SYS_CONNECT_BY_PATH(VALUE, ' > ') AS PATH_VALUE
      , AA.*
  FROM  TABLE_A AA
START WITH  NUM = 1 -- 시작조건은 언제나 1일때 입니다.
CONNECT BY  NUM = PRIOR NUM + 1
ORDER SIBLINGS BY  NUM

 

조회 결과는 다음과 같습니다.

NUM   VALUE     CODE      PATH_NUM                                                        LEVEL1     LEVEL2    CODE=0002
1        VALUE1    0001          > 1                                                                       1               
2        VALUE2    0001          > 1 > 2                                                                 1                  2
3        VALUE3    0001          > 1 > 2 > 3                                                           1                  2
4        VALUE4    0001          > 1 > 2 > 3 > 4                                                     1                  2
5        VALUE5    0002          > 1 > 2 > 3 > 4 > 5                                               1                  2                   5
6        VALUE6    0001          > 1 > 2 > 3 > 4 > 5 > 6                                         1                  2                   5
7        VALUE7    0001          > 1 > 2 > 3 > 4 > 5 > 6 > 7                                   1                  2                   5
8        VALUE8    0001          > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8                             1                  2                   5
9        VALUE9    0001          > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9                       1                  2                   5
10      VALUE10  0001          > 1 > 2 > 3 > 4 > 5 > 6 > 7 > 8 > 9 > 10              1                  2                   5

 검정색은 SYS_CONNECT_BY_PATH 등으로 뽑아낸 값인데...

빨간색 부분이 제가 정작 뽑아 내고 싶은 것입니다.

LEVEL1에 해당하는 값 LEVEL2에 해당하는 값, 그리고 특정 조건의 값 등을 뽑아내고 싶은데...

뭔가 쉬운 방법이 있는지 궁금하네요... 

이 글에 대한 댓글이 총 1건 있습니다.

WITH TABLE_A AS (
SELECT  1 AS NUM, 'VALUE1' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  2 AS NUM, 'VALUE2' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  3 AS NUM, 'VALUE3' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  4 AS NUM, 'VALUE4' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  5 AS NUM, 'VALUE5' AS VALUE, '0002' AS CODE FROM DUAL UNION ALL
SELECT  6 AS NUM, 'VALUE6' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  7 AS NUM, 'VALUE7' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  8 AS NUM, 'VALUE8' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  9 AS NUM, 'VALUE9' AS VALUE, '0001' AS CODE FROM DUAL UNION ALL
SELECT  10 AS NUM, 'VALUE10' AS VALUE, '0001' AS CODE FROM DUAL
)
select NUM,VALUE,CODE,NUM_NUM,
       REGEXP_SUBSTR(NUM_NUM,'[^,]+',1,1) level1,
       REGEXP_SUBSTR(NUM_NUM,'[^,]+',1,2) level2,
       REGEXP_SUBSTR(NUM_NUM,'[^,]+',1,(select num from table_a where code = '0002')) level5
from
(
    SELECT  NUM,VALUE,CODE,wm_concat(NUM) over(order by NUM) NUM_NUM
    FROM  TABLE_A
)

허재영(k26187116)님이 2010-12-31 12:07에 작성한 댓글입니다.
이 댓글은 2010-12-31 13:40에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
38287to_date관련 문의 [3]
임우빈
2011-01-03
3777
38286NUMBER형데이터 조회 [2]
이종성
2011-01-03
3649
38285이런 경우에는 어떻게 처리하는게 빠를까요? [3]
조형래
2011-01-03
3005
38284START WITH... CONNECT BY 로 연결시킨 구문에서 특정값을 뽑아오고 싶습니다. [1]
전현욱
2010-12-31
4462
38283약간좀 이상한 결과 [2]
김흥수
2010-12-31
3141
38282구분자가 있는 한필드의 결과를 세로로 [4]
짜집기
2010-12-30
5555
38281analyze 후 느려짐 [6]
궁금이
2010-12-30
4127
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다