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一样。