Oracle中根据特定的分隔符拆分字段
记录⼀下在Oracle数据库中碰到的问题。
⼀、问题
该问题的需求是查询最新时间段的⼀条数据并取出某⼀个栏位的值
其中SEG07栏位的数据是⽤特殊符号 ^ 来区分。
oracle切割字符串函数⼆、解决⽅案
1、由于要选出最新的⼀条数据,将SEG07栏位中的数据进⾏降序排列
2、将降序排列后的第⼀条数据显⽰(表数据太⼤,防⽌后续CONNECT BY循环时间过长,⽽且⼀条以上使⽤CONNECT BY就会卡死,不知道什么原因)
3、将SEG07中的数据通过正则表达式筛选出来,并将分理出的数据循环排列,形成虚拟表
三、⽅法实现
使⽤REGEXP_SUBSTP⽅法
REGEXP_SUBSTR函数格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进⾏正则处理的字符串
__pattern :进⾏匹配的正则表达式
__position :起始位置,从第⼏个字符开始正则表达式匹配(默认为1)
__occurrence :标识第⼏个匹配组,默认为1
__modifier :模式('i'不区分⼤⼩写进⾏检索;'c'区分⼤⼩写进⾏检索。默认为'c'。)
CONNECT BY的⼀些⽤法可以查看这篇⽂章
具体语法如下:
SELECT ID,CREATE_TIME,REGEXP_SUBSTR(SEG07,'[^^]+',1,LEVEL)SEG07
FROM (
SELECT ID,CREATE_TIME,SEG07,SEG08
from(
SELECT ID,CREATE_TIME,SEG07,SEG08
FROM TableName
WHERE SEG08=:VALUE
ORDER BY CREATE_TIME_MS DESC)
WHERE ROWNUM =1)
CONNECT BY LEVEL<= LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) +1;
其中LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) + 1是⽤来判断SEG07中字符串的个数的
LENGTH (SEG07)是SEG07字符串的总长度,如:1^2^3的总长度就是5
LENGTH (REPLACE (SEG07, '^',''))是通过REPLACE⽅法将SEG07中的分隔符去掉,如:1^2^3转换后=>123,这样长度就是3
然后LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) ,如:上述例⼦LENGTH (1^2^3) - LENGTH (REPLACE (1^2^3, '^','')) = 2,⽽其中的字符串为3,所以需要加⼀
其实这个就相当于去数字符串中的分隔符然后加⼀
REGEXP_SUBSTR(SEG07,'[^^]+',1,LEVEL)中的'[^^]+部分是正则表达式,其中[^^]+红⾊的部分是字符串的分隔符,可以为[^,]+,[^-]+等等
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论