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 --> 수치가 부적절합니다. 오류발생합니다.
a.code1 = to_number(b.code2) 이렇게 하시면 될듯요. 아 그런데.. db 종류가..?
오라클입니다.~
어~ 이상하네요..
where to_char(a.code1) = b.code2 과
where a.code1 = to_number(b.code2) 과
where to_number(a.code1) = to_number(b.code2) 이
수치가 부적절합니다. 나와서 문의한건데.ㅠㅠ
뭐가 이상했던걸까요??
감사합니다.^^
to_number(b.code2) 에서 b.code2 값이 수치로 변환할 수 없는 값이 있으면 오류가 나는 거예요.
where TRANSLATE(b.code2, '1234567890' ||b.code2, '1234567890') != b.code2
이렇게 검색해보시면 숫자가 아닌 값이 있는지 체크 가능할 거예요.
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 함수(문자치환/숫자여부확인...등등에 유용)|작성자 쏘울라입
그냥 이렇게 단순 비교하셔도 됩니다.
WHERE a.code1 = b.code2
숫자와 문자를 비교하면 문자가 숫자로 자동 변환됩니다.
그런데 에러가 난다면?
b.code2 에 숫자로 변환 불가능한 문자가 있다는 뜻이구요.
에러자료를 찾아 제거 하는 노력보다는...
그냥 문자로 비교하는게 간단할 듯 하네요.
WHERE LPAD(a.code1, 6, '0') = b.code2
WHERE TO_CHAR(a.code1, 'fm000000') = b.code2