문자열 생성인데 이상하게 나와서 그럽니다. 0 8 687

by 푸릉이 [2018.04.03 16:46:07]


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번, 누락, 기타 상태" 이런식으로 깔끔하게 나오게하는 신통방통한 쿼리가 있을까요?

 

by 마농 [2018.04.03 16:59:57]

원하시는 결과표를 보여주세요.
위에 기술되지 않은 '04' 는 어찌 표현해야 하는지?
4번째 행의 널인 자료는 어떤 결과를 원하느지?
막연하게 확장될 수 있다라고만 언급하지 마시고, 확장 되었을 때의 예시도 보여주세요.


by 푸릉이 [2018.04.03 17:12:26]

제가원하는 결과는 
첫번째 로우부터 
1번, 2번, 누락, 기타 상태
1번 상태 (,빠짐)
1번, 3번, 4번 상태
없음 상태

그리고 코드값은 0102 이런식으로 코드값이 큰녀석이 뒤로 쌓이는 형태입니다. 0201로는 안들어옵니다.
확장은 코드 40 -> 4번, 70->'중복' 이런식으로 더 생길수  있다는 의미입니다.


by 마농 [2018.04.03 17:19:59]

'04' 와 '40' 의 결과가 동일하게 '4번' 인가요? 결과가 모호하네요
혹시 '0n' ==> 'n번' 형태의 규칙이 존재하는 건 아닌가요? 아니면 규칙 없이 무작위 인가요?


by 푸릉이 [2018.04.03 17:52:04]

아 실수네요..04 -> 4번입니다.

보통 코드가 0으로 시작하는2자리는 1번 이런식으로 대체되고

앞자라수가 0이 아닌 2x로 이런식으로 시작하는건 기타나 누락같은 상태가 됩니다.


by 웅 [2018.04.03 17:33:45]

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;

 


by 푸릉이 [2018.04.03 18:10:52]

컬럼별로 아닌 텍스트 한줄씩을 원했는데 컬럼을 따로 빼내는걸 || 로 연결하니 잘되네요. 고맙습니다.


by 마농 [2018.04.03 18:00:21]
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
;

 


by 푸릉이 [2018.04.03 18:07:54]

와 장난아니네요 주옥같은 쿼리입니다. 고마습니다.

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