number, char 형 비교 가능한가요??? 7

by 스나이퍼 [2016.04.26 11:24:45]


A 테이블의 code1 필드 6자리 number

B 테이블의 code2 필드 6자리 char

입니다.

저장데이터는

A 테이블 : 2, 1900, 2355, 102020 등등 ~

B 테이블 : 000002, 001900, 002355, 102020 등등 ~

이렇게 저장되어 있습니다.

아래처럼, A테이블 자료와 B테이블 자료를 비교하여 동일한값을 조회할려고 합니다.

where a.code1 = b.code2 //

예를 들어 A테이블의 2를 000002 로 변환하거나, B테이블의 000002를 2로 변환하는 방법이 있을까요?

여러가지 테스트하는데 잘 안되네요..

조언 바랍니다.

ex)

where to_char(a.code1) = b.code2 -->  102020 만 조회되고요

where to_char(a.code1,'000000') = b.code2 -->  수치가 부적절합니다. 오류발생합니다.

 

 

 

 

 

 

 

 

by jkson [2016.04.26 11:34:46]

a.code1 = to_number(b.code2) 이렇게 하시면 될듯요. 아 그런데.. db 종류가..?


by 스나이퍼 [2016.04.26 11:35:29]

오라클입니다.~

 


by 스나이퍼 [2016.04.26 11:39:17]

어~ 이상하네요..

where to_char(a.code1) = b.code2 과

where a.code1 = to_number(b.code2) 과

where to_number(a.code1) = to_number(b.code2) 이

수치가 부적절합니다. 나와서 문의한건데.ㅠㅠ

뭐가 이상했던걸까요??

 

 


by 스나이퍼 [2016.04.26 11:44:59]

감사합니다.^^

 


by jkson [2016.04.26 11:49:20]

to_number(b.code2) 에서 b.code2 값이 수치로 변환할 수 없는 값이 있으면 오류가 나는 거예요.

where TRANSLATE(b.code2, '1234567890' ||b.code2, '1234567890') != b.code2

이렇게 검색해보시면 숫자가 아닌 값이 있는지 체크 가능할 거예요.

 


by 스나이퍼 [2016.04.26 12:13:07]

to_number(b.code2) 에서 b.code2 값이 수치로 변환할 수 없는 값이 있으면 오류가 나는 거예요.

where TRANSLATE(b.code2, '1234567890' || b.code2, '1234567890') != b.code2

이렇게 검색해보시면 숫자가 아닌 값이 있는지 체크 가능할 거예요.

--------------------------------------------------------------------------------------

좋은 정보 감사합니다.^^

TRANSLATE 찾아보니 아래처럼 있어서 나중에 다시 한번 제 글 볼때 사용하기 위해 추가합니다.

감사합니다.^^

--------------------------------------------------------------------------------------

1. 단순 문자열 치환 : TRANSLATE('대상문자열', '비교문자', '바꿀문자')
    > select translate('12345', '1', 'x')  from dual;
    > select replace('12345', '1', 'x')  from dual;

 둘다 결과값은 동일합니다.


2. 숫자 제거 : TRANSLATE('대상문자열', ' +.0123456789', ' ')
    > select translate('abc1def2', ' +.0123456789', ' ')  from dual

 숫자 1,2 가 제거되고 'abcdef' 을 리턴합니다.

 응용하면,
 > select nvl(length(translate('a', ' +.0123456789', ' ')),0)  from dual     ==> 1을 리턴
 > select nvl(length(translate('1', ' +.0123456789', ' ')),0)  from dual     ==> 0을 리턴

 위와 같이 숫자 여부 판단에 사용될 수 있습니다. 왠지 숫자여부 판단하는 함수가 있을듯한데;;


3. 문자 제거 : TRANSLATE('대상문자열', '0123456789'||'대상문자열', '0123456789')
    > select translate('abc1def2', '0123456789' || 'abc1def2', '0123456789')  from dual          ==> 12를 리턴

 응용하면,
 > select translate('010-123-4567', '0123456789' || '010-123-4567', '0123456789')  from dual  ==> 0101234567 을 리턴

 예) select TRANSLATE('전화번호', '0123456789'||'전화번호', '0123456789') from dual;
 숫자만 리턴됩니다~


오라클 8i 이상부터는 이용할 수 있습니다.

[출처] 오라클 TRANSLATE 함수(문자치환/숫자여부확인...등등에 유용)|작성자 쏘울라입

 


by 마농 [2016.04.26 13:12:46]

그냥 이렇게 단순 비교하셔도 됩니다.
 WHERE a.code1 = b.code2
숫자와 문자를 비교하면 문자가 숫자로 자동 변환됩니다.


그런데 에러가 난다면?
b.code2 에 숫자로 변환 불가능한 문자가 있다는 뜻이구요.
에러자료를 찾아 제거 하는 노력보다는...
그냥 문자로 비교하는게 간단할 듯 하네요.
 WHERE LPAD(a.code1, 6, '0') = b.code2
 WHERE TO_CHAR(a.code1, 'fm000000') = b.code2

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