select ext.org_channel_type as ORG_CHANNEL_TYPE from channel.channel_pub_info i left join channel.sec_organize_ext ext on i.channel_id = ext.organize_ ...
select
ext.org_channel_type as ORG_CHANNEL_TYPE
from channel.channel_pub_info i
left join channel.sec_organize_ext ext
on i.channel_id = ext.organize_id
left join channel.cm_bs_static_data a
on a.code_value = ext.org_channel_type
and a.code_type = 'FIRST_ORG_TYPE'
where 1 = 1
AND ORG_CHANNEL_TYPE='80002'
昨天下午執行這條語句一直報OracleORA-01722: invalid number,以為是ORG_CHANNEL_TYPE='80002'的問題,改成ORG_CHANNEL_TYPE=80002後還是報這個錯。而改成ORG_CHANNEL_TYPE='80009'就不會報錯,只是查不出數據,因為80009這個數據沒有。
原因是:channel.cm_bs_static_data的code_value 是varchar2類型,而channel.sec_organize_ext.org_channel_type是number類型,Oracle會從channel.cm_bs_static_data表中檢索所有的code_value ,這樣裡面就有非數字的code_value ,Oracle在比較varchar與number時,會採用to_number(code_value )=ext.org_channel_type,所以會報OracleORA-01722: invalid number的錯誤。改成a.code_value = CAST(ext.org_channel_type AS varchar2(20))後,對ext.org_channel_type進行先轉varchar再比較就可以了。
在這兒,有人就會問了,那改成ORG_CHANNEL_TYPE='80009'就不會報錯?是為什麼?
原因是:80009在channel.sec_organize_ext中就不存在,所以不會去執行left join channel.cm_bs_static_data a
on a.code_value = ext.org_channel_type
and a.code_type = 'FIRST_ORG_TYPE',也就不會檢索code_value ,所以不會報錯。