设为首页 收藏本站
查看: 888|回复: 0

[经验分享] db2字符串函数

[复制链接]

尚未签到

发表于 2016-11-17 10:06:02 | 显示全部楼层 |阅读模式
  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一样。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301575-1-1.html 上篇帖子: DB2数据库常用命令数据库学习 下篇帖子: Monitor DB2 Load & Import
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表