oracle截取字符串区间段的⼀部分字符串
Oracle SQL中实现indexOf和lastIndexOf功能,substr和instr⽤法
博客分类: oracle
PL/SQL
instrsubstrlastindexofindexoforacle .
Oracle SQL中实现indexOf和lastIndexOf功能
Oracle, SQL, indexOf, lastIndexOf
今天遇到⼀个问题,需要将⼀个格式为1_2_3这样的字符串拆解组成1_3的串,并⽤SQL更新数据库。
在Oracel中,可以⽤substr和INSTR函数来实现此功能。
substr的第三个参数为1时,实现的是indexOf功能。
substr的第三个参数为-1时,实现的是lastIndexOf功能。
最后的SQL语句如下:
update ebms_data_table t f_name = substr(t.name, 0, INSTR(t.name, '_', 1, 1))|| substr(t.name, INSTR(t.name, '_', -1, 1)+1);
(⼆)
再给⼤家举个例⼦:
select
i1.name,
instr(i1.name, '司', 1) + 1 as 公司出现的位置,
instr(i1.name, '分公司', 1) as 分公司出现的位置,
substr(i1.name,
instr(i1.name, '司', 1) + 1,
((instr(i1.name, '分公司', 1)) - (instr(i1.name, '司', 1) + 1))) as subname
from insurance_company1 i1
where i1.name like '%股份有限公司%分公司'
and i1.upcustomer like '%股份有限公司'
查询结果如下:
名字全称司出现的位置分公司出现的位置          subName
1  天安保险股份有限公司伊犁分公司                  11            13                    伊犁
2  中国⼤地财产保险股份有限公司新疆分公司        15            17                 新疆
3  中国平安财产保险股份有限公司乌苏分公司        15            17                    乌苏
4  中国平安财产保险股份有限公司新疆分公司        1
5            17                    新疆
5  中国平安⼈寿保险股份有限公司新疆分公司        15            17                    新疆
6  中国⼈民财产保险股份有限公司阿克苏地区分公司 15            20                    阿克苏地区
oracle切割字符串函数7  中国⼈民财产保险股份有限公司阿勒泰地区分公司 15            20                    阿勒泰地区
8  中国⼈民财产保险股份有限公司昌吉回族⾃治州分公司    15            22                    昌吉回族⾃治州
后边的subName就是我成功截取的名字,就是我要截取的全名字的中后边不同分公司的字段,⽬的就是为了要获取不同的字段,然后进⾏分析。
这⾥是substr和instr的综合使⽤。
substr(stirng1,strat,length);截取功能;
解析⼀下:string1是你要截取的字符串,strat是要开始截取的位置,length是你要截取多少个字符串。
instr(string1,string2,end);是检索功能,
解析⼀下:string1是你要检索的字符串,string2是你在string1中要查的字符串,end的意思1代表从字符串的开始检索,-1代表中字符串的末尾开始检索。具体返回值  如果
  string1 为零长度
  InStr返回 0
  string1 为 Null
  InStr返回 Null
  string2 为零长度
  InStr返回 Start 的值
  string2 为 Null
  InStr返回 Null
  string2 不到
  InStr返回 0
  在 string1 中到string2
  InStr返回到的位置
  start 值 > len(string1 )值
  InStr返回 0;
当instr将我们要检索字段的位置到后,即返回所在的位置数据,我们就是可以利⽤substr函数进⾏截取,length就是我们我们检索出来的数字的差额。
select
i1.fdisplayname,
instr(i1.fdisplayname, '事',1,1)+1 as 事,
instr(i1.fdisplayname, '业',1,2)+1 as 业,
substr(i1.fdisplayname,
instr(i1.fdisplayname, '事',1,1)+1,
((instr(i1.fdisplayname, '业',1,2)) - (instr(i1.fdisplayname, '事',1,1)+1))) as subname
from SHENZHENJM1222.B i1
分三步:
1.
select
i1.fdisplayname,
instr(i1.fdisplayname, '事',1,1)+1 as 事,
instr(i1.fdisplayname, '业',1,2)+1 as 业
from SHENZHENJM1222.B i1
第⼆部:
select
substr(i1.fdisplayname,
instr(i1.fdisplayname, '事',1,1)+1, ((instr(i1.fdisplayname, '业',1,2)+1) - (instr(i1.fdisplayname, '事',1,1)+1))) as subname from SHENZHENJM1222.B i1
如果想改变边界值,只需+后⾯的数字即可

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