在這篇博客SQL挑戰——如何高效生成編碼裡面我由於需要將數字格式化為字符,像12需要格式化0012這樣的字符,所以使用了TO_CHAR(數字,'0000')這樣的寫法,後面0000表示缺省補零,測試過程中,我發發現TO_CHAR(number,'0000') 會多一個空格。有點納悶為什麼了會多一個空格。
後面經過查看官方文檔、同事討論以及網友提供的資料,終於把這個問題給弄清楚了。下面梳理、總結於此,希望對其它人有所幫助。
在官方文檔https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34570裡面你能看到一段介紹
Number Format Elements
A number format model is composed of one or more number format elements. The tables that follow list the elements of a number format model and provide some examples.
Negative return values automatically contain a leading negative sign and positive values automatically contain a leading space unless the format model contains the MI, S, or PR format element.
注意紅色部分,意思是Number類型轉換為字符時,負數會返回前面包含負號的字符串,正數則會返回前面包含空格的字符串,除非格式模式包含MI、S、或PR元素。查看TO_CHAR(4, '0000')返回的字符串長度,你會發現其長度為5.
1: SQL> SELECT TO_CHAR(4, '0000') FROM DUAL;
2:
3: TO_CH
4: -----
5: 0004
6:
7: SQL> SELECT LENGTH(TO_CHAR(4, '0000')) FROM DUAL;
8:
9: LENGTH(TO_CHAR(4,'0000'))
10: -------------------------
11: 5
12:
13: SQL> SELECT TO_CHAR(-4, '0000') FROM DUAL;
14:
15: TO_CH
16: -----
17: -0004
那麼如何解決這個問題呢,目前有兩種方法,一種方法是用TRIM去空格,另外一種是使用參數MI(MI參數是正數的空格放到字符串後面,將負數的負號放置在字符串後面),關於參數MI的解釋如下所示:
Returns negative value with a trailing minus sign (-).
Returns positive value with a trailing blank.
Restriction: The MI format element can appear only in the last position of a number format model.
返回負值與尾隨的負號 (-)。
返回正值尾隨空白。
限制: MI 格式元素可以只能出現在數字的格式模式的最後一個位置。
其實這些還只是TO_CHAR函數的冰山一角,如果你通讀文檔https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34570那麼你會發現其實你所掌握的TO_CHAR函數還只是個皮毛而已。一個TO_CHAR函數如此強大,可見ORACLE的博大精深。
參考資料:
http://blog.163.com/wangpeng126_2009@126/blog/static/121022611201454111640254/
https://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34570