今天工作的时候需要对事物描述分割取出具体细节,细节分割用特殊符号分开如“文字描述1文字描述2文字描述3” AS 描述字段
经过一番折腾,终于写出分割的SQL,纪录思路如下,顺便记录下substr以及instr的用法,若有更好的方法望可以告知-0-
结果:
“substr(描述字段,
0,
instr(描述字段'')-1) AS
文字描述1,”
“substr(substr(描述字段,instr(描述字段,'',1,1)),
2,
instr(substr(描述字段,instr(描述字段,'')+1),'')-1) AS
文字描述2,”
“substr(描述字段,instr(描述字段,'',1,2)),2) AS 文字描述3”
思路如下:
1、取“文字描述1”:
“substr(描述字段,
0,
instr(描述字段,'')-1) AS
文字描述1,”
很简单,首先用instr取出“描述字段”中,到第一个分隔符''的位数,然后用substr取该位数-1(去掉分隔符)的所有字符,即可取出“文字描述1”
2、取“文字描述3”:
“substr(描述字段,instr(描述字段,'',1,2)),2) AS 文字描述3”
也很简单,首先用instr取出“描述字段”中,到第二个分隔符''的位数,然后从第二位开始(第一位是分隔符)取出剩下字段,即可取出“文字描述3”
3、取“文字描述2”
“substr(substr(描述字段,instr(描述字段,'',1,1)),
2,
instr(substr(描述字段,instr(描述字段,'')+1),'')-1) AS
文字描述2,”
这是我折腾了最久的地方,因为需要确定首尾的分隔符。
首先是用substr(描述字段,instr(描述字段,'',1,1))确定要取的字段,然后剩下的文字描述中,从第二个字符起(跳过分隔符),然后用instr(substr(描述字段,instr(描述字段,'')+1),'')-1)确定之后的要取出的字符长度
后面发现这里可以想法在取的字符里掐头逻辑看起来更好,,可以改用
substr(substr(描述字段,instr(描述字段,'',1,1)),
2,
改成
substr(描述字段,instr(描述字段,'',1,1)+1),
1
这里掐头和后面的
instr(substr(描述字段,instr(描述字段,'')+1),'')-1)
去尾搭配
看起来更加清晰
补充用法:
instr用法:insrt(原字符串,要查找字符,开始位置(数字,可选,默认1),第几次出现(数字,可选,默认1,为负数报错))
substr用法:substr(字符串,从第几位开始截取(默认0),取几位(默认全取))
顺便一个意外,在ORACLE里没有len(),而采用length()代替