DB2 sql除法运算结果为小数时显示0的解决方法。
今天在DB2下写sql的时候遇到了这样的一个问题,
【分享点1:】
SELECT field1/field2 FROM TB;
当 field1的数值 > field2的数值时,除法得出的结果是<1的,即0.xxxxxx
这个时候在DB2的环境下SELECT出来的值是0
这个有两个解决方法
方法1:
DB CFG的一个参数MIN_DEC_DIV_3,这个参数在GET DB CFG FOR DB中并不会列出,但却可以修改。
数据库配置参数MIN_DEC_DIV_3会更改涉及小数的十进制算术运算的结果小数位。
默认值为No,则小数位计算为 31-p+s-s'。
如果设置为Yes,则小数位计算为 MAX(3, 31-p+s-s')。
这会导致十进制小数部分始终至少具有3位的小数位。精度始终为31。
这个方法貌似需要通过DBA对数据库进行设置,不太靠谱儿,有另外一种方法可以曲线救国,登场:
将sql语句修改为:
1 | SELECT CAST(field1 AS DOUBLE)/field2 FROM TB; |
就是先把field1转换成DOUBLE类型的,这样计算出来的就会得出小数点了,会显示出0.xxxxxx
【分享点2:】
额,接下来,需要对得出的小数点位数进行约束,那就用四舍五入吧,
1 | SELECT ROUND(CAST(field1 AS DOUBLE)/field2, 2) FROM TB; |
这个意思就是说四舍五入,保留两位小数点
【分享点三:】
但是如果field1或者field2有一个字段为NULL的话,那么结果为NULL,这个时候根据逻辑需要进行如下的一个操作,
如果数据列的值为NULL,将其设置为0,那么sql就要这么写
1 | SELECT ROUND(COALESCE(CAST(field1 AS DOUBLE), 0)/field2, 2) FROM TB; |
COALESCE这个函数系统的用法如下:
a. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,”)把NULL转换成”;
b. 输入类型为整型,且允许为空的,可以使用COALESCE(inputParameter,0),把空转换成0;
c. 输入参数为字符类型,且是非空非空格的,可以使用COALESCE(inputParameter,”)把NULL转换成”,然后判断函数返回值是否为”;
d. 输入类型为整型,且是非空的,不需要使用COALESCE函数,直接使用IS NULL进行非空判断。
好,就这么多了,OVER。。。
参考:
DECIMAL数据类型相除后的精度和小数位和数据库配置参数
www-01.ibm.com/support/docview.wss?uid=csc1a671ee5bc525954a4825711c002d4edb
min_dec_div_3 - 十进制分隔小数位为 3 配置参数
publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004470.htm
我的简介: 谁说tmd巨蟹座傻来的?我就是tmd巨蟹里边儿最聪明的!!!
哈哈。。好复杂啊,没接触过DB2