oracle INSTR与SUBSTR结合使用,截取表中某含有标识符,多个字节的字段,如:(4408***/4408***/4408***/4408***)
- instr语法
- SUBSTR语法
- 示例
- 大致解释。。
- 查询结果图
instr语法
instr(sourceString,destString,start,appearPosition)
sourceString:源字符串;
destString:要从源字符串中查找的子串;
start:查找的开始位置,这个参数可选的,默认为1;
appearPosition:想从源字符中查找出第几次出现的destString,这个参数也是可选的, 默认为1 。
SUBSTR语法
SUBSTR(sourceString,start,length)
sourceString:源字符串;
start:截取的开始位置;
length:截取的长度,默认到strat到最终位置的长度;
示例
SELECT
INSTR(Gajgjgdm,'/') as 第一个分号的位置,
INSTR(Gajgjgdm||'/440899571111','/',-1) as 最后一个分号的位置,
Gajgjgdm||'/440899571111' as 增加一个字段440899571111,
SUBSTR(Gajgjgdm||'440899571111',1,INSTR(Gajgjgdm||'/440899571111','/')-1) as 第一个字段,
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111','/',1,2)+1,12) as 第三个字段,
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111','/',1,3)+1,12) as 最后一个字段,
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111','/',-1)+1,12) as 最后一个字段
FROM ZJ_ZA_LGY_LGXX T
大致解释。。
如下图所示:
注:Gajgjgdm只是我的表中的一个字段名。
表ZJ_ZA_LGY_LGXX的Gajgjgdm字段的格式为“440800000000/440803000000/440803570000”,为了详细示例,手动通过||’440899571111’给Gajgjgdm增加一个字节,现在为4个字节:440800000000/440803000000/440803570000/440899571111。
如果要取第一个字节,可以使用INSTR语句:INSTR(Gajgjgdm,’/’),得到第一个“/”的坐标位置,INSTR(Gajgjgdm,’/’)默认查找的起始位置为1以及“/”第一次出现的位置,由于字节440800000000长度为12,可以得出”/”第一次出现的位置为13;然后通过SUBSTR语句截取Gajgjgdm 这一列,从第1位开始,长度为12的字节:
SUBSTR(Gajgjgdm||'440899571111',1,INSTR(Gajgjgdm||'/440899571111', '/')-1)
依次类推,需要截取第二段第三段第四段都是同样的原理,如截取第三个字段,先使用INSTR语句:INSTR(Gajgjgdm ||’/440899571111’,’/’,1,2)找出“/”第二次出现的位置,为26,由于字段中每一该字节的长度都是12,所以这里我直接使用了
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111','/',1,2)+1,12)
如果字节的长度是不固定的,可以通过查询“/”第二次出现的位置与第一次出现的位置的差作为SUBSTR的长度,如:
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111','/',1,2)+1,INSTR(Gajgjgdm||'/440899571111','/',1,3)-INSTR(Gajgjgdm||'/440899571111','/',1,2)-1)
实际操作中不一定这个字段每个都是固定3个或者4个字节,这时候如果需要取最后一个字节,如何操作?
INSTR(Gajgjgdm, '/',-1)
表示查询的为最后一次“/”出现的位置,如果需要截取某列最后一个字节但是此字段拥有不相等的字节,可以使用
INSTR(Gajgjgdm, '/',-1)
来得出“/”最后一次出现的位置,有上述substr语法可知substr语句不定义长度的时候默认取到最后一个字节,这时候再使用
SUBSTR(Gajgjgdm||'440899571111',INSTR(Gajgjgdm||'/440899571111', '/',-1)+1)
可得。