1. 程式人生 > >DB2字元函式簡介及使用

DB2字元函式簡介及使用

1、ASCII(s):取表示式s最左端一個字元的ascii碼。
引數:任意內建字元型別,
返回值:integer型別。
db2 => values (ascii('A'),ascii('Abc'),ascii('1'),ascii('@'),ascii(null))
1           2           3           4           5
----------- ----------- ----------- ----------- -----------
         65          65          49          64           -
  1 條記錄已選擇。

2、chr(n)
:取ascii碼n所代表的字元
引數:integer或者smallint型別,範圍0-255
返回值:1個長度的字元。
db2 => values (chr(65),chr(49),chr(64),chr(35))
1 2 3 4
- - - -
A 1 @ #
  1 條記錄已選擇。

3、character_length(string,param2)(或者char_length(s,p))取字串的長度
引數:string為任意字串,或者graphic型別的字串。
      param2可以是codeunits16 — 16位的UTF-16編碼,即string被表示為16位的UTF-16編碼的字串。
                  codeunits32 — 32位的UTF-32編碼,即string被表示為32位的UTF-32編碼的字串。
                  octets — 認為是位元組字串。
返回值:返回string的儲存的字元的實際長度。

db2 => select char_length(firstnme,octets),length(trim(firstnme)),firstnme from employee fetch first 5 rows only


1           2           FIRSTNME
----------- ----------- ------------
          9           9 CHRISTINE
          7           7 MICHAEL
          5           5 SALLY
          4           4 JOHN
          6           6 IRVING
  5 條記錄已選擇。

相關函式:length(str)
,返回str的長度。

4、concat(str1,str2):連線字串
引數:引數1和引數2可以是字元型別,數值型別,或者時間日期型別的資料。但是他們之間存在著相容性,如下:
      4.1 二進位制字串只能與二進位制字串連線
      4.2 只有unicode編碼的資料庫才支援character字串和graphic字串相連,
          在連線之前,character字串會被轉換為graphic字串。
          需要注意的是,被定義為FOR BIT DATA的character字串是不能轉換為graphic字元型的。
      4.3 若引數不是字串,那麼在連線的過程中,將會被隱式的轉換為字串。
返回值:結果的長度和型別取決於在進行任何相互相容的轉換之後的型別和長度。
db2 => values (concat(sysdate,current time),concat(1,2)+10,concat(1,'q'),concat('chen_','CSDN'))

1                           2                                          3  4
--------------------------- ------------------------------------------ -- ---------
2013-03-22-22.22.4422:22:44                                         22 1q chen_CSDN
  1 條記錄已選擇。

字串連線還可以使用符號||:
db2 => values (current date||' '||current time)

1
-------------------
2013-03-23 06:56:57
  1 條記錄已選擇。

5、lower(s)
:將字元轉換為小寫
引數:引數必須是char或者varchar型別。
      unicode編碼的資料庫中,支援graphic字串,在改變為小寫之前先轉換為character字串。
      當引數為null的時候,返回值也為null。
返回值:字元或者字串的小寫形式,結果的型別與長度保持不變。

db2 => values (lower('U'),lower(null))

1 2
- -------------------------------------
u -
  1 條記錄已選擇。
lcase():作用於lower()函式一樣。
lower(locale sensitive)
lower(sysfun schema)


7、upper(s):將字元轉換為大寫
引數:char或者varchar字元型。
返回值:字元或者字串的大寫形式,結果的型別和長度保持不變。

db2 => values (upper('abc'),upper(null))

1   2
--- -------------------------------------
ABC -
  1 條記錄已選擇。

相關函式:
ucase():與upper()函式作用相同。

8、translate(str,to,from[,pad]):將str中的from全部替換為to,若length(to)<length(from),則用pad補齊。
引數:str:字串
      to:字元或者字串
      from:字元或者字串
      pad:字元或者字串
返回值:返回被替換之後的字串,需要注意的是,若是同音詞,也會被替換。
        若length(to)<length(from),則結果中原來字串from不足長度的地方使用空格補齊。
db2 => values (translate('text1 text2 test3 text4','*' ,'text','#'))

1
-----------------------
*##*1 *##*2 *#s*3 *##*4
  1 條記錄已選擇。

db2 => values (translate('text1 text2 test3 text4','*' ,'text'))

1
-----------------------
*  *1 *  *2 * s*3 *  *4
  1 條記錄已選擇。

translate是一個功能強大的函式,更多資訊:translate函式

相關函式:
replace(str,from,to):將字串str中的字元from全部替換為to。
若想將'text1 text2 test3 text4'中的所有空格都去掉:
db2 => values (replace('text1 text2 test3 text4',' ',''))

1
-----------------------
text1text2test3text4
  1 條記錄已選擇。

9、substr(str,start,len)
引數:str:可以為字元型別,數值型別,時間日期型別;
      非字串在進行擷取之前,都被隱式的轉換為varchar型別。
      對於雙位元組字元(全形),將不返回任何值。
      start:擷取字串的起始位置,integer型別,若非integer型別,將會隱式轉換為integer型別。
      大小在1和字串的長度(定長)或者最大長度(變長)之間(正數)。
      len:擷取字串的長度,integer型別,若非integer型別,將會隱式轉換為integer型別。
      注意:這三個引數可以其他函式生成。
返回值:字元型別。
db2 => values (substr('chenlinbo_csdn_china',11,4))

1
----
csdn
  1 條記錄已選擇。

擷取小數部分:
db2 => values (substr('100.101',locate('.',char(100.101))+1 ),100.101)

1       2
------- --------
101      100.101
  1 條記錄已選擇。
擷取小數的方法:http://www.csdn.net/bobo12082119/archive/

10、substrb(str,start,len):擷取字串長度
引數:str:同substr()函式;
      start:若為正數,與substr()函式相同;
             所為負數,則從字串的末尾開始向字串的開始位置處尋找擷取的位置,
             若絕對值大於字串的長度,返回0長度的字串。
             若為0,則從str的起始位置1開始擷取。
      len:若非integer型別,則隱式自動轉換為integer型別。
           若len>length(str),則擷取的長度為:length(str) - start + 1。
           若len<0,則len=0,即結果返回一個0長度的字串。
返回值:返回值的型別為字元型,長度取決於len引數。
        返回值的長度:
        10.1 引數len<=0,返回值長度為0
        10.2 若start不是常量,len是一個常量,結果的長度為:len和length(str)中的最小值。
        10.3 若start為常量,len為指定,結果的長度為:length(str)-|start|。
             若len為變數,則結果的長度為:length(str) - start + 1。
        10.4 若start、len都為常量,結果的長度為:len和(length(str) - start + 1)中的最小值。

values (length(substrb('abcdef',-1,0)),
        substrb('abcdef',-2,5),
        length(substrb('abcdef',-2,-3)))

1           2  3
----------- -- -----------
          0 ef           0
  1 條記錄已選擇。

相關函式:substring

11、ltrim(str):去掉字串前面的空格
引數:引數可以是字元型(char、varchar、graphic、vargraphic),數值型或時間日期型。
      非字元資料,將被隱式轉換為字元型。
返回值:若引數為char或者varchar型別,返回值為varchar型別。
        若引數為vargraphic或者graphic,返回值為vargraphic型別。
        若引數為多個空格,則返回長度為0的字串,及空串。
db2 => values (ltrim('   abc ')||'-'||sysdate)
1
---------------------------
abc -2013-03-23-13.57.34
  1 條記錄已選擇。

12、rtrim(str):去掉字串末尾的空格
引數:引數可以是字元型(char、varchar、graphic、vargraphic),數值型或時間日期型。
      非字元資料,將被隱式轉換為字元型。
返回值:若引數為char或者varchar型別,返回值為varchar型別。
        若引數為vargraphic或者graphic,返回值為vargraphic型別。
        若引數為多個空格,則返回長度為0的字串,及空串。

db2 => values (length(ltrim('   ')),rtrim(' abc   ')||'cde')
1           2
----------- ----------
          0  abccde
  1 條記錄已選擇。

13、trim(str):trim是一個功能比較強大的函式,能去掉字串左右的空格或者多次出現的字元。
完整的語法如下:
>>-TRIM--(--+-----------------------------------------+--string-expression--)-><
            | .-BOTH-----.                            |                         
            '-+----------+--+-----------------+--FROM-'                         
              +-B--------+  '-strip-character-'                                 
              +-LEADING--+                                                      
              +-L--------+                                                      
              +-TRAILING-+                                                      
              '-T--------'
引數:
BOTH:從字串的前後去掉指定字元,簡寫B。
LEADING:從字串的最前端去掉指定字元,簡寫L。
TRAILING:從字串的末尾去掉指定字元,簡寫T。
未指定這三個引數,預設為BOTH。

strip-character:去掉的單個字元;若此引數為指定,則預設為去掉字串左或右的空格。
FROM str:引數可以是字元型(char、varchar、graphic、vargraphic),數值型或時間日期型。
          非字元資料,將被隱式轉換為字元型。
返回值:去掉指定字元或者空格的字串。

去掉空格例項:
values (length(trim(' abc ')),          --去掉空格之後,長度為3 
        'A'||trim(b from ' abc ')||'E', --去掉前後的空格
        'A'||trim(t from ' abc '),      --去掉尾部的空格
        trim(l from ' abc ')||'D'       --去掉前端的空格
       )
1           2       3      4
----------- ------- ------ ------
          3 AabcE   A abc  abc D
  1 條記錄已選擇。

去掉重複出現的字元 — 簡寫(l,t,b):
values (trim(l 'a' from 'abcd'),   --
        trim(t 'd' from 'abcd'),   --
        trim(b 'e' from 'eabcde')) --
1    2    3
---- ---- ------
bcd  abc  abcd
  1 條記錄已選擇。
去掉重複出現的字元 — 全稱(leading,trailing,both)
values (trim(leading 'a' from 'abcd'),
        trim(trailing 'd' from 'abcd'),
        trim(both 'e' from 'eabcde'))
1    2    3
---- ---- ------
bcd  abc  abcd
  1 條記錄已選擇。

相關函式:
strip():去除字串前後空格或者多次出現的字元。
語法如下:
>>-STRIP--(--string-expression--+-----------------------------------------+--)-><
                                '-,--+-BOTH-----+--+--------------------+-'      
                                     +-B--------+  '-,--strip-character-'        
                                     +-LEADING--+                                
                                     +-L--------+                                
                                     +-TRAILING-+                                
                                     '-T--------'
db2 => select salary,digits(salary),strip(digits(salary),b,'0') from employee fetch first 5 rows only

SALARY      2         3
----------- --------- ---------
  152750.00 015275000 15275
   94250.00 009425000 9425
   98250.00 009825000 9825
   80175.00 008017500 80175
   72250.00 007225000 7225
  5 條記錄已選擇。

14、lpad(str,len,pad):在字串str的左側使用pad字元(或字串)補齊使其長度達到len,前提是str的長度小於len。
引數:str:可以是字元型(char、varchar、graphic、vargraphic),數值型或時間日期型。
      若非字串,在進行操作之前都將全部轉換為字串。
      len:結果的長度,integer型別,character字串長度的限制為32672,graphic字串的限制為16336。
      pad:補充的字元或者空格。
返回值:對於varchar型別的字串,結果為右對齊的字串,左邊按照給定的字元補齊。
        對於char型別的字串,因為其長度已經固定,所以結果類似於在字串的前面新增len-length(str)個pad。
        若len<length(str),則結果將是str的擷取,substr(str,1,len)。
db2 => describe table employee

                                資料型別                      列
列名                             模式       資料型別名稱      長     小數位      NULL
------------------------------- --------- ------------------- ---------- ----- ------
......
FIRSTNME                        SYSIBM    VARCHAR                     12     0 否
.....
JOB                             SYSIBM    CHARACTER                    8     0 是
......
  14 條記錄已選擇。

select firstnme,lpad(firstnme,12,'.'),lpad(firstnme,5,'.'),lpad(job,10,'.') 
  from employee
 fetch first 5 rows only

FIRSTNME     2            3     4
------------ ------------ ----- ----------
CHRISTINE    ...CHRISTINE CHRIS ..PRES
MICHAEL      .....MICHAEL MICHA ..MANAGER
SALLY        .......SALLY SALLY ..MANAGER
JOHN         ........JOHN .JOHN ..MANAGER
IRVING       ......IRVING IRVIN ..MANAGER
  5 條記錄已選擇。

15、rpad(str,len,pad):在字串str的右側使用pad字元(或字串)補齊使其長度達到len,前提是str的長度小於len。
其他引數同lpad()函式,例項如下:
select firstnme,rpad(firstnme,12,'.'),rpad(firstnme,5,'.'),rpad(job,10,'.')
  from employee
 fetch first 5 rows onl

FIRSTNME     2            3     4
------------ ------------ ----- ----------
CHRISTINE    CHRISTINE... CHRIS PRES    ..
MICHAEL      MICHAEL..... MICHA MANAGER ..
SALLY        SALLY....... SALLY MANAGER ..
JOHN         JOHN........ JOHN. MANAGER ..
IRVING       IRVING...... IRVIN MANAGER ..
  5 條記錄已選擇。

16、locate(str,Source,start[,strunit]):查詢Source字串中字元(或字串)str,在start位置後首次出現的位置。
引數:str:字元或者字串。
      source:字串
      start:integer型別,必須大於0,預設值為1。
      strunit:★CODEUNITS16, CODEUNITS32, or OCTETS★,此引數非必選。
返回值:integer型別,str首次在source中從start位置開始出現的位置。
        未找到,則返回0。
        若str和source其中一個為null的話,返回值也為null。
        若str是長度為0的字串,則返回1。
        若source的長度為0,則返回0。
例項:
db2 => select cid,coalesce(cname,'UNKNOW'),sex,age from test1

CID        2                    SEX AGE
---------- -------------------- --- -----------
1          scott                M            30
002        chenlinbo            M            20
003                             F            21
004        UNKNOW               F            32
  4 條記錄已選擇。

select coalesce(cname,'UNKNOW'),   --等同於nvl(cname,'UNKNOW'),去部位null的那個引數
                                   --等同於value(str1,str2),返回不為空的字串
       locate('o',cname,1),        --返回o首次出現的位置,從位置1開始,若sname為null,則返回0
       locate('',cname,1),         --若str是長度為0的字串,則返回1
       locate(null,cname,1)        --str、source其中一個為null,則返回null
  from test1
1                    2           3           4
-------------------- ----------- ----------- -----------
scott                          3           1           -
chenlinbo                      9           1           -
                               0           1           -
UNKNOW                         -           -           -
  4 條記錄已選擇。

相關函式:locate_in_string(str,source,start,strunit):同locate()函式,不同點就是支援start小於0。
instr()是locate_in_string()函式的別名。

17、position(str,source,strunit):查詢str字元(或字串)在source字串中首次出現的位置。
strunit引數必須有:CODEUNITS16, CODEUNITS32, or OCTETS。
引數如上,與locate()函式不同的它不可以指定查詢的其實位置,預設從字串的起始位置查詢。

db2 => select position('co',cname),cname from test1
SQL0440N  找不到具有相容自變數的型別為 "FUNCTION" 的名為 "POSITION"
的已授權例程。  SQLSTATE=42884

db2 => select position('co',cname,octets),cname from test1

1           CNAME
----------- --------------------
          2 scott
          0 chenlinbo
          0
          - -

  4 條記錄已選擇。

相關函式:posstr(source,str)


18、left(str,len[,strunit]):擷取字串str左端的len個長度的字元。
引數:
str:字元型別,定長或者邊長,graphic字串(雙位元組字串)。
     非字元型,在進行擷取之前都轉換為變長字串。
len:擷取的長度,
     若len=0,則返回一個長度為0的字串;
     若len<0,則報錯,超出了範圍;
     若len>length(str),則取整個字串str。
strunit:非必須引數,可為CODEUNITS16, CODEUNITS32, or OCTETS。
返回值:返回擷取的字串,若str為null,則返回null,其他引數可視為無效。

db2 => values (left('abcdef',-3))
SQL0138N  內建字串函式的數字自變數超出了範圍。  SQLSTATE=22011

db2 => select cname,left(cname,5),left(cname,21) from test1
CNAME                2                    3
-------------------- -------------------- ---------------------
scott                scott                scott
chenlinbo            chenl                chenlinbo

-                    -                    -
  4 條記錄已選擇。

19、right(str,len,strunit):擷取str右端的len個長度的字串。
引數:
str:字元型別,定長或者邊長,graphic字串(雙位元組字串)。
     非字元型,在進行擷取之前都轉換為變長字串。
len:擷取的長度,
     若Len<0,報錯,內建字串函式的數字自變數超出了範圍。
     若len=0,返回一個0長度的字串。
     若len>length(str),則取str字串。
strunit:非必須引數,可為CODEUNITS16, CODEUNITS32, or OCTETS。
返回值:若str為null,則返回null,可視其他引數無效。

db2 => select cname,right(cname,3),right(cname,21) from test1
CNAME                2                    3
-------------------- -------------------- ---------------------
scott                ott                  scott
chenlinbo            nbo                  chenlinbo

-                    -                    -
  4 條記錄已選擇。

20、space(n):返回n個空格,n為integer或者smallint型別。
db2 => values (length(space(10)))
1
-----------
         10
  1 條記錄已選擇。

21、coalesce(str1,str2):返回2個字串中不為空的那一個
功能相同的還有:nvl(str1,str2)value(str1,str2)

22、nvl2(str1,str2,str3)
此函式可以使用case表示式來表示,如下:
CASE WHEN str1 IS NOT NULL
     THEN ste2
     ELSE str3
END

db2 => select cname,nvl2(cname,cname,'UNKNOW') from test1

CNAME                2
-------------------- --------------------
scott                scott
chenlinbo            chenlinbo

-                    UNKNOW
  4 條記錄已選擇。

23、initcap(str):將str字串的首字母大寫。
db2 => values (initcap('i''m a boy'),initcap('SCOTT'),initcap('scott'),initcap('___yeeXun'),initcap('890csdn'))

1         2     3     4         5
--------- ----- ----- --------- -------
I'M A Boy Scott Scott ___Yeexun 890csdn
  1 條記錄已選擇。

更多資訊,參照:DB2內建函式

--the ned--