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)中的'[^^]+部分是正則表達式,其中[^^]+紅色的部分是字符串的分隔符,可以為[^,]+,[^-]+等等

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM