Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
          小數點前的0的顯示問題
          ?
          ?
          ??? 在處理數據時發現一個問題,Oracle對于小于1的小數,小數點前面的0是不顯示的。這個問題遇到的很普遍,解決的方法也挺多的。大致上研究了一下這個問題,提供了用to_char和decode函數來解決這個問題的兩種方法。先來看一下這個問題:
          ?
          ?
          SQL> create table t1_number (num number);
          Table created
          ?
          SQL> insert into t1_number values(0.3268);
          1 row inserted
          ?
          SQL> insert into t1_number values(0.57965686);
          1 row inserted
          ?
          SQL> insert into t1_number values(52345234.5686);
          1 row inserted
          ?
          SQL> insert into t1_number values(4.552686);
          1 row inserted
          ?
          SQL> commit;
          Commit complete
          ?
          SQL> column num format 99999999999.9999999999999
          SQL> select * from t1_number;
          ?
          ?????????????????????? NUM
          --------------------------
          ??????????? .3268000000000
          ??????????? .5796568600000
          ??? 52345234.5686000000000
          ?????????? 4.5526860000000
          ?
          ?
          ?
          ??? 使用PL/SQL DEV工具查看時是有前面的0的
          ??? 通過column num format 000000000000.99999999999設置也可以顯示前面的0
          ?
          ??? 但是這些都只是顯示的結果,而不是數據庫保存結果
          ?
          SQL> column num format 00000000000.9999999999999
          SQL> select * from t1_number;
          ?
          ?????????????????????? NUM
          --------------------------
          00000000000.3268000000000
          00000000000.5796568600000
          00052345234.5686000000000
          00000000004.5526860000000
          00000000005.2920000000000
          ?
          SQL> select substr(num,1,1) from t1_number;
          ?
          SU
          --
          .
          .
          5
          4
          5
          ?
          ??? 可以看到,無論前面出現多少位,通過substr函數獲取的第一位任然是'.'
          ?
          ?
          ??? 無論怎么轉換,只要最終輸出結果是數值型的,小數點前的0必然被丟棄,所以只有將數值轉換為字符型,大致有兩種方法:
          ?
          ?
          1、直接使用to_char函數
          ?
          ??? 首先實驗一下將小數點前和小數點后都加上99999999的格式:
          ?
          SQL> select to_char(num,'999999999.999999999') from t1_number;
          ?
          TO_CHAR(NUM,'9999999
          --------------------
          ????????? .326800000
          ????????? .579656860
          ? 52345234.568600000
          ???????? 4.552686000
          ???????? 5.292000000
          ?
          ??? 發現小數點前還是沒有0,而小數點后的0多出來了
          ??? 再實驗一下小數點前和小數點后都加上0000000000格式:
          ?
          SQL> select to_char(num,'00000000000.000000000') from t1_number;
          ?
          TO_CHAR(NUM,'000000000
          ----------------------
          00000000000.326800000
          00000000000.579656860
          00052345234.568600000
          00000000004.552686000
          00000000005.292000000
          ?
          ??? 發現小數點前是有0了,但是兩邊的0都多出來了,使用FM來去掉多于的0:
          ?
          SQL> select to_char(num,'fm00000000000.000000000') from t1_number;
          ?
          TO_CHAR(NUM,'FM0000000
          ----------------------
          00000000000.326800000
          00000000000.579656860
          00052345234.568600000
          00000000004.552686000
          00000000005.292000000
          ?
          ??? 沒有效果,說明FM只能去掉用9表示的格式中產生的0:
          ?
          SQL> select to_char(num,'fm999999999.999999999') from t1_number;
          ?
          TO_CHAR(NUM,'FM99999
          --------------------
          .3268
          .57965686
          52345234.5686
          4.552686
          5.292
          ?
          ??? 但是這樣還是沒有0,最后發現可以將小數點前的第一位置為0即可(注意9的個數要大于數值的位數):
          ?
          SQL> select to_char(num,'fm999999990.999999999') from t1_number;
          ?
          TO_CHAR(NUM,'FM99999
          --------------------
          0.3268
          0.57965686
          52345234.5686
          4.552686
          5.292
          ?
          ??? 檢查一下第一位,沒有問題:
          ?
          SQL> select substr(to_char(num,'fm999999990.999999999'),1,1) from t1_number;
          ?
          SU
          --
          0
          0
          5
          4
          5
          ?
          2、使用decode函數
          ?
          ??? 既然小于1的小數首位必然是'.',那就判斷首位是否為'.',是則在前面加上'0'即可
          ?
          SQL> select decode(substr(num,1,1),'.','0'||num,num) from t1_number
          ?

          DECODE(SUBSTR(NUM,1,1),'.','0'||NUM,NUM)
          -----------------------------------------
          0.3268
          0.57965686
          52345234.5686
          4.552686
          5.292
          ?
          ??? 同樣檢查一下第一位,沒有問題
          ?
          SQL> select substr(decode(substr(num,1,1),'.','0'||num,num),1,1) fro
          m t1_number;
          ?
          SU
          --
          0
          0
          5
          4
          5
          ?
          ?
          ??? 也可以寫個函數來判斷一下,不過可以用decode直接出來,感覺也沒什么必要,暫時就這些吧。
          ?
          ?
          posted on 2008-10-29 21:12 decode360 閱讀(781) 評論(0)  編輯  收藏 所屬分類: 05.SQL
          主站蜘蛛池模板: 南皮县| 闽侯县| 广宁县| 墨江| 肇东市| 全南县| 磐石市| 元朗区| 孝昌县| 鄂托克前旗| 太仓市| 香港| 晋宁县| 读书| 望江县| 荔浦县| 信宜市| 修水县| 闽清县| 阿鲁科尔沁旗| 天气| 聂拉木县| 平利县| 庆云县| 兖州市| 从化市| 龙井市| 昭平县| 阿城市| 类乌齐县| 新乡市| 察雅县| 洪泽县| 榆中县| 灵璧县| 海南省| 格尔木市| 调兵山市| 星子县| 十堰市| 兴宁市|