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