日期:2014-05-16  浏览次数:20556 次

Oracle某些函数及应用
2、使用decode函数

select trim('   123456       ') from dual;

    既然小于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(待比较的对象,如果为这个,那麼结果为这个,否则结果是这个)
===============================================================

语法格式:substr(cExpression,nStartPosition [,nCharactersReturned])   其中,cExpression指定要从其中返回字符串的字符表达式或备注字段;nStartPosition用于指定返回的字符串在字符表达式或备注字段中的位置,nCharactersReturned用于指定返回的字符数目,缺省时返回字符表达式的值结束前的全部字符。  
 3.举例: 
 substr('abcdefghijlkm',1,5) 显示 "abcde"
 substr('abcdefghijlkm',6) 显示 "fghijklm"  
 substr('abcdefghijlkm',-2)显示“km”
 substr('abcdefghijlkm',-4)显示“jlkm”



================================================================
小数点前的0的显示问题
    在处理数据时发现一个问题,Oracle对于小于1的小数,小数点前面的0是不显示的。

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格式: