제가 지금 한테이블에 있는 자료들을 화면으로 뿌려주려고 합니다.
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컬럼값을 분할을 해서 넣을수 있는지 궁금해서 올립니다.
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 이라면 이렇게도 가능은 하지만 위에것이 더 좋죠..
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 ;