PNU코드로 본번, 부번 검색하기 질문이요 0 2 2,354

by 해피해킹 PNU [2014.01.23 15:55:20]


select PNU,BON_BUN, BU_BUN, SAN
from (
    select
        PNU,
        SAN,
        CASE WHEN TRIM(TRANSLATE(BON, '0123456789', '          ')) IS NULL
        THEN TO_CHAR(TO_NUMBER(BON))
        END BON_BUN,
        CASE WHEN TRIM(TRANSLATE(BU, '0123456789', '          ')) IS NULL
        THEN TO_CHAR(TO_NUMBER(BU))
        END BU_BUN
from 
       (
        select PNU, substr(PNU, 12, 4) BON, substr(PNU, 16, 4) BU, substr(PNU, 11, 1) SAN
        from LP_PA_CBND
        where substr(PNU, 1, 10) = '2811014700'
        )
    )
    
    where BON_BUN like '5'
;

다음과 같이 쿼리를 만들었습니다. 가장 마지막의 WHERE절에서 본번과 부번을 받아서 like검색을 걸어서 사용할려고 하는데요.

문제는 인터넷에서 검색해서 퍼와서 만들었는데...

CASE WHEN TRIM(TRANSLATE(BON, '0123456789', '          ')) IS NULL
     THEN TO_CHAR(TO_NUMBER(BON))
     END BON_BUN,

이 부분이 이해가 잘 가질 않습니다.

TRANSLATE으로 BON이 '0123456789'이면 ' '즉 공란('    ')으로 처리 한값이 널이면  -_-.;

BON을 숫자로 변환후에 다시 문자로 변환한이유도 모르겠구요 -_-;

기능 검색하면서 쳐다보고 있는데 각각의 대한 기능을 얼추 알겠으나 뭉쳐놓고 보니 잘 이해가 가질 않습니다.

부족한 신입에게 답변 부탁드립니다.




by 마농 [2014.01.23 16:25:27]

TO_CHAR(TO_NUMBER(bon)) 은 숫자로 구성된 문자열에서 앞에 0 을 제거하기 위한 방법중 하나입니다.
'00005' ==> '5'
그런데 문제는 bon 에 숫자가 아닌 다른 문자가 포함된다면 에러가 나게 되구요.
에러를 피하기 위해 숫자만으로 구성되었는지를 판단하는 것이죠.
TRIM(TRANSLATE(bon, '0123456789', '   ')) IS NULL
이 구문은 간단하게 TRANSLATE(bon, 'a0123456789', 'a') IS NULL 하시면 됩니다.
숫자만으로 구성되어 있으면 앞에 0 제거, 아니면 아예 널을 반환.


그런데 마지막 검색조건이 LIKE 라구요?
LIKE 라면 굳이 숫자로 바꾸는 짓을 할 필요가 있을까요?
앞에 0 제거는 LTRIM 을 이용하시면 됩니다.
LTRIM(bon, '0')
이러면 숫자인지 판단할 필요가 없죠.


by 해피해킹 [2014.01.23 16:47:38]
감사합니다.  많은 도움 얻어갑니다.
 이글 뿐만 아니라 다른분께서 올려준글에도 항상 마농님의 상세한 답글 감사히 보고있습니다.
좋은 하루 되세요!
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입