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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章