bigint 與 nvarchar2比較時發生隱式類型轉換的坑
1. 案例分析
假設:
- table1有下面兩個字段:
id:bigint
,source_id nvarchar2(50)
- 數據庫中id 的值一定大于 int4 的最大值,例如存在一條單據:
id=1947854462980792321
,source_id= 1947849730132353025
滿足上面兩個條件后,執行下面的sql,一定會報錯:
ERROR: Value "1947849730132353025" is out of range for type integer.
這就是因為再進行a.id = p.source_id
這塊計算時,nvarchar2 的source_id
隱式轉換為 int4 失敗導致的。
SELECT a.id, a.source_id, FROM table1 a INNER JOIN (SELECT id, source_id, approve_dt, wf_flg FROM table1 WHERE id = 1947854462980792321) p ON a.id = p.source_id
2. 解決方法:
2.1 方案 1:設置 id 和 source_id 的類型一致
- 要么都采用 varchar
- 要么都采用 bigint(但是要注意前端 number 類型超長問題)
2.2 方案 2:寫 sql 手動進行類型轉換
SELECT a.id, a.source_id, FROM table1 a INNER JOIN (SELECT id, source_id, approve_dt, wf_flg FROM table1 WHERE id = 1947854462980792321) p ON a.id = p.source_id::BIGINT