一、錯誤類型及描述
1、錯誤類型
2、錯誤描述
a、關聯表之后出現“無效數字”
b、日期轉為字符類型出現“無效數字”
c、數字乘以空格出現“無效數字”
(需要特別注意空格字符)
d、表名寫錯出現"無效數字"
3、錯誤原因
a、數字不能與非數字字符外的其他字符關聯(NULL除外)
SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT 'abd' b,'value' c FROM DUAL)T2 ON T1.A=T2.B
表T1 表T2
用T1的A字段與T2的B字段關聯就會出現“無效數字”
SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT '10' b,'value' c FROM DUAL)T2 ON T1.A=T2.B
當T2的B字段值為 '10'就不會這樣的問題
因為ORACLE會自動把數字字符串轉為數字,表T2如下
如果不確定某字段是否具有非數字字符串,可以用distinct來查詢,有時候要注意NULL值和空格字符,因為看起來是一樣的,但是點空格字符會發現有空格
b、日期字段原本就是varchar2類型,再用TO_CHAR就會出現錯誤
c、數字不能乘以數字字符外的其他字符(NULL除外)
SELECT 5*' ' FROM DUAL;
d、表名是ods.formtable,但是寫成ods._formtable,不小心在前面多加一橫就會出錯。
二、解決方法
1、對於a、c種錯誤原因,當數字與字符串類型的字段進行關聯或者乘除操作時,要注意字符類型應為“數字字符”,或者通過case when 把非數字字符的值改為null
SELECT * FROM (SELECT 1 a FROM DUAL)T1 LEFT JOIN (SELECT 'abd' b,'value' c FROM DUAL)T2 ON T1.A=(case when regexp_like (t2.b,'([^.0-9])+') then null else t2.b end)
SELECT 5*(case when regexp_like (' ','([^.0-9])+') then null end)a FROM DUAL;
2、注意查看字段原本類型,如果日期字段原本就是字符類型,通過to_char轉換成字符類型就會出錯,可以通過substr來截取。
3、注意查看表名。