Oracle处理数字型数据

  • 问题场景:当sql中有两个字段需要加减乘除时,结果小数位数可能精度溢出或太长。这时候就需要用到to_char()函数。
  • 假设:example表中字段a = 0.333,字段 b = 2,现在需求是求相乘后,保存两位小数。
  • 补充:还有四种方法处理数字类型数据(oracle中的函数)
  • 1.round(n,int)函数。n代表要处理的数据,int代表保留小数点的位数。
  • 2.trunc(n1,n2)函数。n1代表要处理的数据,n2代表截取小数点的位数。
  • 3.ceil(n)函数。n代表要向上取整的数据。同时四舍五入。
  • 4.floor(n)函数。n代表要取整的数据。不会四舍五入。
  • 备注


问题场景:当sql中有两个字段需要加减乘除时,结果小数位数可能精度溢出或太长。这时候就需要用到to_char()函数。

to_char(expr,conversion)。
(1)expr是需要转换的值。常见的有日期(date),数字(number)。
(2)conversion是需要转换的格式。常见:日期(YYYY-MM-DD HH24:MI:SS)HH24则代表00-24时,同样可以换成HH12(00-12时)、数字(9999990.99)其中9代表需要转换number的最大位数,没有则补上一个空格。其中的0.则是预防可能小于1.0的小数,在转换时避免丢失前置的0。
更详细的转换类型,请看文章末尾的导航。

假设:example表中字段a = 0.333,字段 b = 2,现在需求是求相乘后,保存两位小数。

sql如下:

select to_char(e.a * e.b,'9999999999.99') as sum from example e

但是,上面的sql在处理0.xxx的时候会出现一个问题。

hive sql中 to_char替换函数 hive里面to_char_数据库


所以,针对问题,对’9999999999.99’做优化。

优化后sql如下:

select trim(to_char(nvl(e.a * e.b,0.00),'9999999990.99')) as sum from example e

优化1:增加nvl(expr1,expr2)函数,当expr1为空时,就将expr2的值返回。反之将expr1的值返回。这样可以避免两个字段为null时,前台显示为null。

优化2:把’9999999.99’->‘99999990.99’。当然,9的个数看业务需求自定义。关键点在于小数点前的9换成了0,这样就可以让0.xxx格式化时,0不会被过滤。

优化3:增加trim(expr1)函数,Oracle中trim()函数的作用一般用与去除expr1值中两边的空格。

补充:

优化4:当数值刚刚好为整数时,即20.00时,格式

运行结果:

hive sql中 to_char替换函数 hive里面to_char_sql_02


提示:去除空格,出来tirm()函数外,还可以在在to_char()中去除。将999999990.99修改成FM99999990.00。

select to_char(nvl(e.a * e.b,0.00),'FM9999999990.00') as sum from example e

拿上面优化的sql举例:将99999990.99改成FM999999990.00。小数点前的999999990代表最大为9为整数,最小为1位整数即避免小数的0.被格式化。后面的00代表最小为2位小数,避免整数出现下面的情况。后置位的00被格式化了。

hive sql中 to_char替换函数 hive里面to_char_数据_03

补充:还有四种方法处理数字类型数据(oracle中的函数)

1.round(n,int)函数。n代表要处理的数据,int代表保留小数点的位数。

hive sql中 to_char替换函数 hive里面to_char_sql_04

2.trunc(n1,n2)函数。n1代表要处理的数据,n2代表截取小数点的位数。

hive sql中 to_char替换函数 hive里面to_char_sql_05

3.ceil(n)函数。n代表要向上取整的数据。同时四舍五入。

hive sql中 to_char替换函数 hive里面to_char_oracle_06

4.floor(n)函数。n代表要取整的数据。不会四舍五入。

hive sql中 to_char替换函数 hive里面to_char_数据_07

备注

mod(n1,n2):返回n1/n2的余数
to_number(expr):返回number类型数据