제가 지금 한테이블에 있는 자료들을 화면으로 뿌려주려고 합니다.
CODE | LABEL | MCODE | SCODE | NAME |
B00 | AM1 | A | ||
BA0 | AM2 | B00 | B | |
BAA | AM3 | B00 | BA0 | C |
BAB | AM3 | B00 | BA0 | C |
BAC | AM3 | B00 | BA0 | C |
R00 | AM1 | B00 | BA0 | A |
RA0 | AM2 | R00 | B | |
RAA | AM2 | R00 | B | |
RAB | AM3 | R00 | RA0 | C |
RAC | AM3 | R00 | RA0 | C |
RAD | AM3 | R00 | RA0 | C |
RAE | AM3 | R00 | RA0 | C |
RAF | AM3 | R00 | RA0 | C |
제가 이런 테이블을 가지고 새로운 조회를 하려고 합니다.
MCODE는 중간 코드로 부모를 가지고 있는 코드입니다.
SCODE는 최하층 분류코드로 MCODE의 CODE를 칭합니다.
CODE는 각각의 NAME의 코드명입니다.
이런 정보를 가지고 조회를 하려고하는데
TOP | MIDDLE | BOTTOM |
A | ||
B | ||
C | ||
C | ||
C | ||
A | ||
B | ||
B | ||
C | ||
C | ||
C | ||
C | ||
C |
식으로 표현을 하려고하는데 NAME컬럼값을 분할을 해서 넣을수 있는지 궁금해서 올립니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WITH TT(CODE, LABEL, MCODE, SCODE, NAME ) AS ( SELECT 'B00' , 'AM1' , NULL , NULL , 'A' FROM DUAL UNION ALL SELECT 'BA0' , 'AM2' , 'B00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'BAA' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'BAB' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'BAC' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'R00' , 'AM1' , 'B00' , 'BA0' , 'A' FROM DUAL UNION ALL SELECT 'RA0' , 'AM2' , 'R00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'RAA' , 'AM2' , 'R00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'RAB' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAC' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAD' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAE' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAF' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL ) SELECT DECODE(LABEL, 'AM1' , NAME ) TOP , DECODE(LABEL, 'AM2' , NAME ) MIDDLE , DECODE(LABEL, 'AM3' , NAME ) BOTTOM FROM TT ; |
R00은 MCODE와 SCODE가 NULL 이어야 하지 않나요?
뭔가 이상해서 LABEL를 이용했습니다.
R00가 MCODE와 SCODE가 NULL 이라면 이렇게도 가능은 하지만 위에것이 더 좋죠..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | WITH TT(CODE, LABEL, MCODE, SCODE, NAME ) AS ( SELECT 'B00' , 'AM1' , NULL , NULL , 'A' FROM DUAL UNION ALL SELECT 'BA0' , 'AM2' , 'B00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'BAA' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'BAB' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'BAC' , 'AM3' , 'B00' , 'BA0' , 'C' FROM DUAL UNION ALL SELECT 'R00' , 'AM1' , NULL , NULL , 'A' FROM DUAL UNION ALL SELECT 'RA0' , 'AM2' , 'R00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'RAA' , 'AM2' , 'R00' , NULL , 'B' FROM DUAL UNION ALL SELECT 'RAB' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAC' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAD' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAE' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL UNION ALL SELECT 'RAF' , 'AM3' , 'R00' , 'RA0' , 'C' FROM DUAL ) SELECT CASE WHEN MCODE IS NULL AND SCODE IS NULL THEN NAME END AS TOP , CASE WHEN MCODE IS NOT NULL AND SCODE IS NULL THEN NAME END AS MIDDLE , CASE WHEN MCODE IS NOT NULL AND SCODE IS NOT NULL THEN NAME END AS BOTTOM FROM TT ; |