WITH T AS (
SELECT '01022030' CODE FROM DUAL UNION ALL
SELECT '01' CODE FROM DUAL UNION ALL
SELECT '010304' CODE FROM DUAL UNION ALL
SELECT '' CODE FROM DUAL
)
SELECT
DECODE(SUBSTR(CODE,1,2), '01', '1번', '02' ,'2번','03', '3번','20', '누락', '30' ,'기타') || ', ' ||
DECODE(SUBSTR(CODE,3,2), '01', '1번', '02' ,'2번','03', '3번', '20', '누락', '30' ,'기타') || ', ' ||
DECODE(SUBSTR(CODE,5,2), '01', '1번', '02' ,'2번','03', '3번', '20', '누락', '30' ,'기타') || ', ' ||
DECODE(SUBSTR(CODE,7,2), '01', '1번', '02' ,'2번','03', '3번', '20', '누락', '30' ,'기타') || ' 상태' AS STATUS
FROM T
2자리씩 각 상태를 나타내는 값이 있는데요
쿼리를 실행하면 제가 원하는 텍스트는 맨처음출력처럼 깔끔한 모양의 데이터를 기대했는데
2번째 3번째 4번째 row는 텍스트 내용도 이상하구요
지금은 5개지만 나중에 코드값이 10개까지 확장될수도 있습니다.
"1번, 3번, 누락, 기타 상태" 이런식으로 깔끔하게 나오게하는 신통방통한 쿼리가 있을까요?
DECODE문에 없는 상태는 추가하시는 걸로...
그런데 이런 식의 코드관리는 하드코딩하겠다는 것처럼 보이는데..코드관리 중요하지 않나요?
WITH T AS ( SELECT '01022030' CODE FROM DUAL UNION ALL SELECT '01' CODE FROM DUAL UNION ALL SELECT '010304' CODE FROM DUAL UNION ALL SELECT '' CODE FROM DUAL ) SELECT code , MAX(decode(code1, '01', '1번')) c01 , MAX(decode(code1, '02', '2번')) c02 , MAX(decode(code1, '03', '3번')) c03 , MAX(decode(code1, '20', '누락')) c20 , MAX(decode(code1, '30', '기타')) c30 FROM (SELECT T1.* , SUBSTR(CODE,T2.LVL*2-1,2) CODE1 FROM (SELECT CODE, NVL(LENGTH(CODE)/2,1) grp FROM T) T1 , (SELECT LEVEL LVL FROM DUAL CONNECT BY LEVEL <= 10) T2 WHERE T1.GRP >= T2.LVL) GROUP BY code;
WITH t AS ( SELECT '01022030' code FROM dual UNION ALL SELECT '01' FROM dual UNION ALL SELECT '010304' FROM dual UNION ALL SELECT '' FROM dual ) SELECT code , SUBSTR( -- REPLACE( -- REPLACE( REPLACE( REPLACE( REGEXP_REPLACE( REGEXP_REPLACE(code , '(..)', ', \1') , ' 0(.)', ' \1번') , '20', '누락') , '30', '기타') -- , '40', '오류') -- , '70', '중복') , 3) || NVL2(code, ' 상태', '없음 상태') AS status FROM t ;