记录一下在Oracle数据库中碰到的问题。
一、问题
该问题的需求是查询最新时间段的一条数据并取出某一个栏位的值
其中SEG07栏位的数据是用特殊符号 ^ 来区分。
二、解决方案
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的一些用法可以查看这篇文章 https://blog.csdn.net/zwjzqqb/article/details/79066224
具体语法如下:
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)中的'[^^]+部分是正则表达式,其中[^^]+红色的部分是字符串的分隔符,可以为[^,]+,[^-]+等等