db2字符串函数
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:
字符串长度255是多少个汉字
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⼀样。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。