Oracle中根据特定的分隔符拆分字段

记录一下在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)中的'[^^]+部分是正则表达式,其中[^^]+红色的部分是字符串的分隔符,可以为[^,]+,[^-]+等等

 

posted @ 2020-09-25 14:15  Julian_jiang  阅读(4242)  评论(0编辑  收藏  举报