背景
- 表dbcontinfo
- 字段loanid,類型為varchar2(60)
- 表dbloanbal
- 字段loanid,類型為char(60)
- loanid字段實際長度為24位
問題
- 兩張表dbloanbal和dbcontinfo進行left關聯查詢,從表的數據查詢不出來,值為null,sql如下
- select n.listid,n.loanacno,n.loanid,w.bailorname from dxLoanBal n left join dbcontinfo w on w.loanid=n.loanid;
- 查詢出來的 bailorname 字段值為null
原因
- 在oracle數據庫中,varchar2()的長度是可以隨着存入字段的長度改變,而char()是固定的,不足的使用空格替代。
- 在dbloanbal中loanid字段存在空格,導致關聯條件失效。
解決問題
- 使用trim()函數去掉空格之后查詢:select n.listid,n.loanacno,n.loanid,w.bailorname from dxLoanBal n left join dbcontinfo w on w.loanid=trim(n.loanid);
擴展:oracle中varchar2()和char()的區別
- varchar2()
- 長度是可變的。設置的是varchar(60),但是當存儲進入的字符串長度為24,實際存儲的長度為24。如果還有長度為25的字段存入,這時這個字段的長度為25,而長度為24的那個字段依舊為24。字段讀取效率沒有char()高。
- char()
- 長度固定。設置的是char(60),但是當存儲進入的字符串長度為24,實際存儲的長度為60,其中有36個空格。但是因為長度不變,數據庫讀取效率高。