테이블에 가입 할 수 있습니다 내가 A1
varchar2(2)
에 조인 B1
char(2)
캐스트 :이 가능 : VARCHAR의 동안을 주조 문자가 오라클
SELECT * FROM A
LEFT JOIN B
ON CAST(B.B1 AS VARCHAR2(2)) = A.A1
그것은 어떤 오류를 발생하지만, 데이터가 표시되지 않습니다.
위 쿼리가 가능합니까?
테이블에 가입 할 수 있습니다 내가 A1
varchar2(2)
에 조인 B1
char(2)
캐스트 :이 가능 : VARCHAR의 동안을 주조 문자가 오라클
SELECT * FROM A
LEFT JOIN B
ON CAST(B.B1 AS VARCHAR2(2)) = A.A1
그것은 어떤 오류를 발생하지만, 데이터가 표시되지 않습니다.
위 쿼리가 가능합니까?
당신은 그것을 캐스팅 할 수는 있지만 생각 중이거나 의존하고있는 것처럼 보이지 않습니다. 당신은 당신이에 가입하고있는 분야의 하나의 문자 값이 가정하면, 당신은 또는 캐스트없이 일치하지 않습니다
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()
호출 내에서 varchar2
에 char
에서 암시 적 변환이 있습니다
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 답 신용 수락 \t wew. . 너무 가까이 ^^ thx 알렉스, 그것은 분명하고 잘 작동 desised. . 나는 당신의 제안으로 마지막 하나를 넣었고 익숙하지만 덤프와 rtrim은 나에게 다른 옵션을 제공한다. . 매우 늦은 답변 btw에 대한 사면. . – user2545028