Oracle DB 之 Char 與 Varchar 資料的條件判斷


在 Oracle 字串資料型態中,

有兩種表達: Varchar2Char,

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


Related Posts Plugin for WordPress, Blogger...