在 Oracle 字串資料型態中,
有兩種表達: Varchar2 與 Char,
Varchar2 在資料長度 < 欄位長度時, 不會自動填入空白.
Char 在資料長度 < 欄位長度時, 會自動填入空白.
這會導致條件在判斷兩種欄位值時, 有些注意事項,
範例如下 :
範例 1
declare
aa varchar2(10) := 'A';
bb char(10) := 'A';
begin
if aa = bb then
dbms_output.put_line( 'aa = bb' );
else
dbms_output.put_line( 'aa <> bb' );
end if;
if aa = rtrim(bb) then
dbms_output.put_line( 'aa = rtrim(bb)' );
else
dbms_output.put_line( 'aa <> rtrim(bb)' );
end if;
end;
-- 結果
aa <> bb
aa = rtrim(bb)
範例 2 步驟 1 - 建立 Temp Table 與 Temp Data
-- 建立 Temp Table
create table tom1(
aa number
, bb varchar2(10)
);
create table tom2(
aa number
, cc char(10)
);
-- 建立 Temp Data
insert into tom1 values( 1, 'A' );
insert into tom1 values( 2, 'B' );
insert into tom1 values( 3, 'C' );
insert into tom2 values( 1, 'A' );
insert into tom2 values( 2, 'B' );
insert into tom2 values( 3, 'C' );
commit;
範例 2 步驟 2 - Decode 條件判斷
-- decode 的 t2.cc 沒有 rtrim
select t1.aa
, decode( t1.bb, t2.cc, 'Y'
, 'N'
) check
from tom1 t1
, tom2 t2
where t1.aa = t2.aa
order by t1.aa;
-- 結果
AA CHECKDATA
------ ---------
1 N
2 N
3 N
-- decode 的 t2.cc 有 rtrim
select t1.aa
, decode( t1.bb, rtrim(t2.cc), 'Y'
, 'N'
) check
from tom1 t1
, tom2 t2
where t1.aa = t2.aa
order by t1.aa;
-- 結果
AA CHECKDATA
------ ---------
1 Y
2 Y
3 Y
範例 2 步驟 3 - Where 條件判斷
-- where 條件的 t2.cc 沒有 rtrim
select t1.aa
, t1.bb
, t2.cc
from tom1 t1
, tom2 t2
where t1.aa = t2.aa
and t1.bb = t2.cc
order by t1.aa;
-- 結果
AA BB CC
------ ------ ------
-- where 條件的 t2.cc 有 rtrim
select t1.aa
, t1.bb
, t2.cc
from tom1 t1
, tom2 t2
where t1.aa = t2.aa
and t1.bb = rtrim(t2.cc)
order by t1.aa;
-- 結果
AA BB CC
------ ------ ------
1 A A
2 B B
3 C C