DB2一個漢字占3個字節,Oracle占兩個字節。
Oracle:
SQL> select lengthb('中') from dual;
LENGTHB('中')
-------------
2
DB2:
db2 => values length('中')
1
-----------
3
1、Locate函數
語法:LOCATE(ARG1,ARG2,<POS>)
LOCATE函數在ARG2中查找ARG1第一次出現的位置,如果指定POS,則從ARG2的POS處開始查找ARG1第一次出現的位置。
db2:
LOCATE 函數返回一個字符串在另一個字符串中第一次出現的起始位置。如果指定了可選的起始位置,則表明它是源字符串中開始進行搜索的字符位置。可以指定一個可選的字符串長度單元來指明在哪些單元中表示函數的起始位置
和結果。可以使用基於字符的函數來解決在 LOCATE 函數中指定起始位置的問題。
locate(String param1,String param2,int param3) 從param2的第param3位置開始,返回param1第一次出現的位置,默認param2為1。
db2 => values locate('a','abca',3,codeunits16)
1
-----------
4
1 條記錄已選擇。
POSITION 函數返回一個字符串在另一個字符串中第一次出現的起始位置。使用基於字符的函數可以解決將字節位置返回為字符位置的問題。
經測試,代碼單元用octets也可以得到正確結果。
db2 => values position('中','abc1中',codeunits16)
1
-----------
5
1 條記錄已選擇。
Oracle:
INSTR(源字符串, 目標字符串, 起始位置, 匹配序號)
INSTR在Oracle/PLSQL中,instr函數返回要截取的字符串在源字符串中的位置。只檢索一次,就是說從字符的開始到字符的結尾就結束。
語法如下:
instr( string1, string2 [, start_position [, nth_appearance ] ] )
參數分析:
string1
源字符串,要在此字符串中查找。
string2
要在string1中查找的字符串.
start_position
代表string1 的哪個位置開始查找。此參數可選,如果省略默認為1. 字符串索引從1開始。如果此參數為正,從左到右開始檢索,如果此參數為負,從右到左檢索,返回要查找的字符串在源字符串中的開始索引。
nth_appearance
代表要查找第幾次出現的string2. 此參數可選,如果省略,默認為 1.如果為負數系統會報錯。
注意:
如果String2在String1中沒有找到,instr函數返回0.
SQL> select instr('中q1abc','a',1) from dual;
INSTR('中Q1ABC','A',1)
----------------------
4
2、字符分解 substr
db2按字節數算,當遇到多字節字符時,會得出意想不到的結果。substr( string, start_position, [ length ] )
db2 => values substr('中abc',1,1)
1
-
substring(string,start_position,length,代碼單元):
返回字符串的子字符串,子字符串是輸入字符串的零個或多個相鄰字符串長度單元。codeunits16和codeunits32代碼單元按字符個數算。
db2 => values substring('中avbc',1,1,codeunits16)
1
-------
中
Oracle中按字符數算,截取指定起始位置的字符串。substr( string, start_position, [ length ] )
SQL> select substr('中abc',1,1) from dual;
SU
--
中
3、字符串長度單元 length
DB2:
使用 OCTETS 作為字符串長度單元時,通過簡單地計算字符串的字節數即可確定字符串的長度。CODEUNITS16 指定將 Unicode UTF-16 用於字符語義。同樣,CODEUNITS32 指定使用 Unicode UTF-32 來理解多字節字符的字符邊界。
使用 CODEUNITS16 或 CODEUNITS32 計算代碼單元得到的結果是相同的,除非使用了增補字符和代理對。使用增補字符時,對於一個增補字符,使用 CODEUNITS16 計算是兩個 UTF-16 代碼單元,而使用 CODEUNITS32 計算則是一個 UTF-32 代碼單元。
如果使用 CODEUNITS 來獲取字符的長度,則用作字符串函數輸入的 CODEUNITS 的不同會導致輸出的不同。
db2 => values CHARACTER_LENGTH('中',octets)
1
-----------
3
1 條記錄已選擇。
db2 => values CHARACTER_LENGTH('中',codeunits16)
1
-----------
1
1 條記錄已選擇。
db2 => values CHARACTER_LENGTH('中',codeunits32)
1
-----------
1
1 條記錄已選擇。
Oracle:
length按字符數算;lengthb按字節數算。
SQL> select length('中'),lengthb('中') from dual;
LENGTH('中') LENGTHB('中')
------------ -------------
1 2
4、去空格函數
LTRIM() 把字符串頭部的空格去掉;
RTRIM() 把字符串尾部的空格去掉;
TRIM() 把字符串頭和尾部的空格去掉。
5、大小寫轉換函數
LOWER()將字符串全部轉為小寫;
UPPER()將字符串全部轉為大寫。
6、ascii()
返回字符表達式最左端字符的ASCII 碼值。
7、char()
db2中將ASCII 碼轉換為字符。如果沒有輸入0 ~ 255 之間的ASCII 碼值,CHAR() 返回NULL 。
8、連接字符串
db2:
select 'a'||'b' from sysibm.sysdummy1
Oracle:
select 'a'||'b' from dual
sqlserver:
select 'a'+ 'b'
9、替換函數 DB2中認為''和null不同
db2:value函數
db2 => values value(null,'a')--結果為a
db2 => values value('','a')--結果為空
Oracle:
nvl(par1,par2)--Oracle中null或''都代表為空
Sqlserver:
isnull(par1,par2)
10、返回參數集中第一個非null參數
values coalesce(null,null,'1')
11、LCASE、LOWER函數
語法:LCASE()、LOWER()
返回定長、變長字符串的小寫形式
12、UCASE、UPPER函數返回定長、變長字符串的大寫形式。
13、時間類型轉換為字符類型
db2:
SELECT varchar(current timestamp) from sysibm.sysdummy1
Oracle:
ELECT to_char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual
sqlserver:
SELECT convert(varchar,getdate(),20)
14、db2的case when else
select case g.master_type
when 'system' then
'管理員'
when 'roletype' then
'特殊角色'
else
'普通用戶'
end AS caseConvert
From global_code g;
15、DB2數據類型改變函數:varchar()、int()、date()、time()等
SQL Server: SELECT convert(varchar,getdate(),20)
Oracle:SELECT to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
DB2: SELECT varchar(current timestamp) from sysibm.sysdummy1
16、取前幾條記錄
SQL Server: Select top n * from xtable
Oracle:Select * from xtable where rownum <=n
DB2:select * from syscat.tables fetch first 10 rows only
17、repeat函數
語法:repeat(parm,int z)
將parm重復z次后輸出
select repeat('a',10) from sysibm.sysdummy1;
18、replace函數
語法:REPLACE(EXP1,EXP2,EXP3)
REPLACE函數用EXP3代替EXP1中所有的EXP2。
db2 => select replace('abcde','bc','oo') from sysibm.sysdummy1
1
-----
aoode
19、REPEAT函數
語法:REPEAT(ARG1,NUM_TIMES)
REPEAT函數返回ARG1被重復NUM_TIMES次的字符串。
eg:
SELECT REPEAT(NAME,2) FROM T1
20、POSSTR函數
語法:POSSTR(EXP1,EXP2)
POSSTR函數返回EXP2在EXP1中第一次出現的位置。
db2 => select posstr('abca','a') from sysibm.sysdummy1
1
-----------
1
21、INSERT函數
語法:INSERT(ARG1,POS,SIZE,ARG2)
INSERT函數返回一個字符串,將ARG1從POS處刪除SIZE個字符,將ARG2插入該位置。
這里的pos是按字節數算的。如果轉化成按字符數算,可以改寫成:INSERT(ARG1,POS,SIZE,ARG2,CODEUNITS16)
db2 => select insert('abcde',2,2,'中') from sysibm.sysdummy1
1
--------
a中de
22、CONCAT函數 等價於 ||
語法:CONCAT(ARG1,ARG2)
CONCAT函數返回兩個字符串的連接。
db2 => select concat('a','b') from sysibm.sysdummy1
1
--
ab
23、LEFT、RIGHT函數
語法:LEFT(ARG,LENGTH)、RIGHT(ARG,LENGTH)
LEFT、RIGHT函數返回ARG最左邊、右邊的LENGTH個字符串,ARG可以是CHAR或BINARY STRING。
這兩個函數的length參數是按字節數算。如果想轉化成按字符數算,可以改寫成LEFT(ARG,LENGTH,CODEUNITS16)
db2 => select left('abcd',3),right('abcd',2) from sysibm.sysdummy1
1 2
---- ----
abc cd
24、LTRIM、RTRIM函數
語法:LTRIM()、RTRIM()
LTRIM、RTRIM函數從CHAR、VARCHAR、GRAPHIC或者VARGRAPHIC中去掉左側或右側的空格。
這個語法和Oracle一樣。