2014-09-08 1 views

답변

5

당신은 그것을 캐스팅 할 수는 있지만 생각 중이거나 의존하고있는 것처럼 보이지 않습니다. 당신은 당신이에 가입하고있는 분야의 하나의 문자 값이 가정하면, 당신은 또는 캐스트없이 일치하지 않습니다

create table a (a1 varchar2(2)); 
create table b (b1 char(2)); 

insert into a values ('X'); 
insert into b values ('X'); 

select * from a left join b on b.b1 = a.a1; 

A1 B1 
-- -- 
X  

select * from a left join b on cast(b.b1 as varchar2(2)) = a.a1; 

A1 B1 
-- -- 
X  
캐스팅 데이터 유형 들어간 상태입니다

아닌 데이터를 ; 그것은 여전히 ​​공백이 채워져 있습니다. 유일한 차이점은 값으로 명시 적으로 수행되었으므로 암시 적으로 char으로 표시됩니다. 사용자는 값 dump() 기능과 동일한 것을 확인할 수

select dump(b.b1) dump_char, 
    dump(cast(b.b1 as varchar2(2))) dump_varchar2 
from b; 

DUMP_CHAR   DUMP_VARCHAR2  
-------------------- -------------------- 
Typ=96 Len=2: 88,32 Typ=1 Len=2: 88,32 

그래서 유형 96 ( char) 1 ( varchar2)로 변경, 값이 동일하다. 테이블 A에 값이 비교하고 당신은 그들이 동일하지 않습니다 볼 수 있습니다 :

select dump(a.a1) dump_varchar2 from a; 

DUMP_VARCHAR2  
-------------------- 
Typ=1 Len=1: 88  

캐스트의 B 값은 여전히 ​​후행 공간이 마련되어의 값은, 그러므로 그들은이 일치하지 않습니다하지 않습니다. 당신은 trim() 또는 rtrim()와 비교하는 후행 공백을 제거 할 수 있습니다 다음 rtrim() 호출 내에서 varchar2char에서 암시 적 변환이 있습니다

select * from a left join b on rtrim(b.b1) = a.a1; 

A1 B1 
-- -- 
X X 

, 당신은 아직도 명확하게하기 위해이 명시 적으로 캐스팅 수 있도록. 이것은 당신이 다른 방법으로 캐스팅 안전 할 수 있습니다 A에 후행 공간이 결코 가정합니다

참고 :

select * from a left join b on b.b1 = cast(a.a1 as char(2)); 

A1 B1 
-- -- 
X X 

을 ...하지만 당신이 캐스팅 측면/트림도에 영향을 줄 것이다 인덱스 수 사용하십시오.

+0

0 답 신용 수락 \t wew. . 너무 가까이 ^^ thx 알렉스, 그것은 분명하고 잘 작동 desised. . 나는 당신의 제안으로 마지막 하나를 넣었고 익숙하지만 덤프와 rtrim은 나에게 다른 옵션을 제공한다. . 매우 늦은 답변 btw에 대한 사면. . – user2545028