ORACLE TO_CHAR函數格式化數字的出現空格的原因


   在這篇博客SQL挑戰——如何高效生成編碼里面我由於需要將數字格式化為字符,像12需要格式化0012這樣的字符,所以使用了TO_CHAR(數字,'0000')這樣的寫法,后面0000表示缺省補零,測試過程中,我發發現TO_CHAR(number,'0000') 會多一個空格。有點納悶為什么了會多一個空格。

clip_image001

后面經過查看官方文檔、同事討論以及網友提供的資料,終於把這個問題給弄清楚了。下面梳理、總結於此,希望對其它人有所幫助。

在官方文檔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

clip_image002

那么如何解決這個問題呢,目前有兩種方法,一種方法是用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 格式元素可以只能出現在數字的格式模式的最后一個位置。

clip_image003

 

其實這些還只是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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM