DB2数值函数简介及使用

学习一种数据库,最开始我们都是从其内部函数开始学习的,这些内部函数对于我们编写SQL有很大的帮助;

本文虽然介绍的不全,但能够起到一个引导作用,具体信息以官网为准。

1、取绝对值的函数:abs、absval
参数个数:1
参数类型:smallint,integer,bigint数据类型;也可以为null,此时返回值也为null。
db2 => select abs(-123),abs(null),abs('-100') from sysibm.sysdummy1
1           2                                          3
----------- ------------------------------------------ ------------------------------------------
        123                                          -                                        100
  1 条记录已选择。


db2 => select abs(NaN)||' '||abs(sNaN)||' '||abs(Infinity) from sysibm.sysdummy1
1
----------------------
NAN SNAN INFINITY
  1 条记录已选择。


2、向上取整:ceil、ceiling
db2 => select ceil(123.89),ceiling(123.49) from sysibm.sysdummy1
1       2
------- -------
   124.    124.
  1 条记录已选择。


如果ceil函数的参数为一个数值组成的字符串,如'123.45',
此函数能够将其转换为一个浮点数,在进行取整操作。
db2 => select ceil(123.45),ceil('123.45') from sysibm.sysdummy1
1       2
------- ------------------------------------------
   124.                                        124
  1 条记录已选择。


3、向下取整数:floor
参数个数:1
参数类型:整数和浮点数,也可以是null,此时返回值为null。
db2 => select floor(123.56),floor(100),floor(-123.99) from sysibm.sysdummy1
1       2           3
------- ----------- -------
   123.         100   -124.
  1 条记录已选择。


db2 => select floor(null) from sysibm.sysdummy1
1
------------------------------------------
                                         -
  1 条记录已选择。


4、求M的n次幂:power(M,n)
返回值:
integer:若两个参数都为integer或者smallint
bigint:若一个为bigint类型,另一个为bigint、integer或者smallint。
double:若两个参数都为浮点数的话。

db2 => select power(3.2,2.1),power(3,2),power(3,0) from sysibm.sysdummy1
1                        2           3
------------------------ ----------- -----------
  +1.15031015682351E+001           9           1
  1 条记录已选择。


5、随机数:rand(m)函数
返回值:返回一个0和1之间的浮点数;若参数为null,结果也为null。
参数:类型为smallint或integer的数,范围在0-2147483647之间的数,称为种子。

db2 => select rand(),rand(500),rand(null) from sysibm.sysdummy1
1                        2                        3
------------------------ ------------------------ ------------------------
  +2.43232520523698E-001   +5.09964293343913E-002                        -
  1 条记录已选择。

生成0-1的随机数:
select rand() from sysibm.sysdummy1

生成0-n的随机整数:
select cast(rand()*n as int) from sysibm.sysdummy1
db2 => values (cast(rand()*10 as int))
1
-----------
          5
  1 条记录已选择。

db2 => values (cast(rand()*10 as int))
1
-----------
          1
  1 条记录已选择。

生成n-m的随机整数(m>n):
select n+cast(rand()*(m-n) as int) from sysibm.sysdummy1
db2 => select 5+cast(rand()*(10-5) as int) from sysibm.sysdummy1
1
-----------
          9
  1 条记录已选择。

db2 => select 5+cast(rand()*(10-5) as int) from sysibm.sysdummy1
1
-----------
          7
  1 条记录已选择。

通过rand() 函数和fetch frist 能随机取表中的行,从表中随机取n行数据
(在fetch first中n必须为大于等于1的整数,否则报错):
select * from tb order by rand() 
fetch first n rows only
db2 => select b.* from (select row_number() over () ,a.empno,a.salary from employee a) b order by rand() fetch first 5 rows only
1                    EMPNO  SALARY
-------------------- ------ -----------
                  19 000210    68270.00
                  20 000220    49840.00
                  11 000130    73800.00
                  30 000320    39950.00
                  12 000140    68420.00
  5 条记录已选择。

db2 => select b.* from (select row_number() over () ,a.empno,a.salary from employee a) b order by rand() fetch first 5 rows only
1                    EMPNO  SALARY
-------------------- ------ -----------
                  18 000200    57740.00
                  13 000150    55280.00
                  17 000190    50450.00
                  15 000170    44680.00
                  33 200010    46500.00
  5 条记录已选择。


6、四舍五入:round (m,n)
参数:m表示一个数值数据,整数或者浮点数,正负数都可以,正负数进位都向其ceil()方向。
     n表示进位的数目,整数表示处理小数点后面的数,负数表示处理整数部分的数,integer类型。
实例:

db2 => values (round(873.726,2),round(873.726,1),
       round(873.726,0),round(873.726,-1),round(873.726,-2),round(873.726,-3))
1         2         3         4         5         6
--------- --------- --------- --------- --------- ---------
  873.730   873.700   874.000   870.000   900.000  1000.000
  1 条记录已选择。


db2 => values (round(-745.5,-2),round(-745.5,-1))
1       2
------- -------
 -700.0  -750.0
  1 条记录已选择。

7、将数值转换为字符串形式:digits()函数
参数:smallint,integer,bigint,decimal;
      char或者varchar类型的数值字符串,在进行此函数操作之前,字符串的值隐式转换为decimal(31,6)。
      参数可以为null,此时返回值为null。
返回值:返回数值的字符串形式,不足长度的自动在字符前补齐0。
        返回固定长度的字符串,若参数为浮点数,小数点后面的也计算在内;
        对于不足长度的,在整数的最前端补0,下面是实例。
employee表的结构如下,最后三个字段的长度为9,小数点位数为2:
db2 => describe table employee
                                数据类型                      列
列名                             模式       数据类型名称      长     小数位      NULL
------------------------------- --------- ------------------- ---------- ----- ------
EMPNO                           SYSIBM    CHARACTER                    6     0 否
FIRSTNME                        SYSIBM    VARCHAR                     12     0 否
MIDINIT                         SYSIBM    CHARACTER                    1     0 是
LASTNAME                        SYSIBM    VARCHAR                     15     0 否
WORKDEPT                        SYSIBM    CHARACTER                    3     0 是
PHONENO                         SYSIBM    CHARACTER                    4     0 是
HIREDATE                        SYSIBM    DATE                         4     0 是
JOB                             SYSIBM    CHARACTER                    8     0 是
EDLEVEL                         SYSIBM    SMALLINT                     2     0 否
SEX                             SYSIBM    CHARACTER                    1     0 是
BIRTHDATE                       SYSIBM    DATE                         4     0 是
SALARY                          SYSIBM    DECIMAL                      9     2 是
BONUS                           SYSIBM    DECIMAL                      9     2 是
COMM                            SYSIBM    DECIMAL                      9     2 是
  14 条记录已选择。


下面是digits函数的转换情况:
select salary,digits(salary),bonus,digits(bonus),comm,digits(comm) 
from employee fetch first 5 rows only

SALARY      2         BONUS       4         COMM        6
----------- --------- ----------- --------- ----------- ---------
  152750.00 015275000     1000.00 000100000     4220.00 000422000
   94250.00 009425000      800.00 000080000     3300.00 000330000
   98250.00 009825000      800.00 000080000     3060.00 000306000
   80175.00 008017500      800.00 000080000     3214.00 000321400
   72250.00 007225000      500.00 000050000     2580.00 000258000
  5 条记录已选择。


8、转换为数值:to_number(string,format)
此函数为decfloat_format的别名。
参数:string为数值型的字符串,如:'-100.1','01234'等。
format为转换后的数值型的呈现格式,有如下形式:
0 or 9:每一个数字代表一个字符。
MI:对于负数,将尾部的负数符号(-)移动到最前头;
    对于正数,将在其前面添加一个符号(+)或者空格。
S:如格式MI
PR:将一对尖括号(<>)包含起来的数视为负数,转换后在其前面添加一个负数符号(-)。
$:必须是转换字符串前面包括$符号。
,:逗号,数值分隔符
. :点号,小数点标志。


db2 => values to_number('123.001') + 0.01
1
------------------------------------------
                                   123.011


db2 => values to_number('123.456','000.000')
1
------------------------------------------
                                   123.456


db2 => values to_number('123.456','000.000')
1
------------------------------------------
                                   123.456
db2 => values to_number('987.123','999.999MI')


1
------------------------------------------
                                   987.123


db2 => values to_number('<123.456>','000.000PR')
1
------------------------------------------
                                  -123.456


db2 => values to_number('$123,456.78','$000,000.00')
1
------------------------------------------
                                 123456.78


9、数值截取函数:trunc(m,n)或者truncate(m,n)
参数:m为数值型,整数或者浮点数;
     n为截取长度,当n大于0,则截取小数部分,当小于0,则截取整数部分
返回值:对于指定数值m,截取n个长度的值。
db2 => values (trunc(873.726,2),trunc(873.726,1),trunc(873.726,0))
您想执行以上命令吗?(y/n) y
1        2        3
-------- -------- --------
 873.720  873.700  873.000
  1 条记录已选择。


db2 => values (trunc(873.726,-1),trunc(873.726,-2),trunc(873.726,2),trunc(873.726,-3))
您想执行以上命令吗?(y/n) y
1        2        3        4
-------- -------- -------- --------
 870.000  800.000  873.720    0.000
  1 条记录已选择。


10、转换为浮点数:decfloat(m,16|34)
参数:m可以是数值型,也可以是字符串(有数值组成的字符串,如'123.98')
返回值:将m转换为长度为16或者34的浮点数,默认为34.


db2 => values (decfloat(123.45),decfloat('-123.45',16)+10)
1                                          2
------------------------------------------ ------------------------
                                    123.45                  -113.45
  1 条记录已选择。

11、数值比较函数:compare_defloat(a,b)
参数:两个参数都是decfloat(34)类型的浮点数,否则将会被自动转换为decfloat(34)。
返回值:
0: a=b
1: a<b
2: a>b
3: a和b没有直接顺序关系


db2 => values (compare_decfloat(decfloat(1.5),decfloat(1.5)),compare_decfloat(decfloat(1.5),decfloat(1.50)))

1      2
------ ------
     0      2
  1 条记录已选择。


db2 => values (compare_decfloat(decfloat(1.770),decfloat(1.77)),compare_decfloat(decfloat(NaN),decfloat(1.2)))

1      2
------ ------
     1      3
  1 条记录已选择。


官网上有下面这个实例:
COMPARE_DECFLOAT(DECFLOAT(2.17), DECFLOAT(2.17)) = 0 
COMPARE_DECFLOAT(DECFLOAT(2.17), DECFLOAT(2.170)) = 2 
COMPARE_DECFLOAT(DECFLOAT(2.170), DECFLOAT(2.17)) = 1 
COMPARE_DECFLOAT(DECFLOAT(2.17), DECFLOAT(0.0)) = 2 
COMPARE_DECFLOAT(INFINITY,INFINITY) = 0 
COMPARE_DECFLOAT(INFINITY,-INFINITY) = 2 
COMPARE_DECFLOAT(DECFLOAT(-2),INFINITY) = 1 
COMPARE_DECFLOAT(NAN,NAN) = 3 
COMPARE_DECFLOAT(DECFLOAT(-0.1),SNAN) = 3


12、normalize_decfloat(decfloat_number)
参数:能够转换为decfloat(16)的smallint,integer,real,double,或者decimal(p,s)(p<=16)类型;
      bigint或者decimal(p,s)(p>16)的将会被转换为decfloat(34)。
返回值:将一个数值转换为一个小数乘以10的n次幂的形式,如1200转换为1.2E3。
db2 => values (normalize_decfloat(decfloat(-1200)),normalize_decfloat(decfloat(1.2000)))

1                                          2
------------------------------------------ ------------------------------------------
                                   -1.2E+3                                        1.2
  1 条记录已选择。


官网上有下面实例:
NORMALIZE_DECFLOAT(DECFLOAT(2.1)) = 2.1
NORMALIZE_DECFLOAT(DECFLOAT(-2.0)) = -2
NORMALIZE_DECFLOAT(DECFLOAT(1.200)) = 1.2
NORMALIZE_DECFLOAT(DECFLOAT(-120)) = -1.2E+2
NORMALIZE_DECFLOAT(DECFLOAT(120.00)) = 1.2E+2
NORMALIZE_DECFLOAT(DECFLOAT(0.00)) = 0
NORMALIZE_DECFLOAT(-NAN) = -NaN 
NORMALIZE_DECFLOAT(-INFINITY) = -Infinity


还有很多系统函数,如数学函数,sin,cos,tan,exp等,常用函数min,max,avg,count等。

详细信息参照官网:http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp

位置:数据库基础 -> SQL -> Functions

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值