本文個人拙見,若有出入,請指出——來自菜的顫抖
創(chuàng)新互聯(lián)公司專注于沂水企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開發(fā)。沂水網(wǎng)站建設(shè)公司,為沂水等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
該方式的效率不高,如何優(yōu)化,請看 記Oracle中regexp_substr函數(shù)的一次調(diào)優(yōu)(速度提高99.5%)
表A中存放了集裝箱的信息,一個集裝箱一條記錄,表B中存放了對于集裝箱操作的指令,一條指令包括多個集裝箱箱號,通過分號 ; 切割( TCIU2347687;XUTR3546865 ),現(xiàn)在的需求是,對于已經(jīng)在指令表B中的集裝箱,在查詢表A時需要過濾掉。
所以必須將分號分割的記錄,拆分成單獨(dú)的記錄。
變成:
Oracle可使用 regexp_substr函數(shù) 實(shí)現(xiàn),實(shí)現(xiàn)上面切割的sql為:
其中 regexp_substr 各個參數(shù)的含義:
結(jié)果就是 aaa , 如果把第二個1變成2,輸出就是 bbb 。
好了,這部分意圖很明顯了,下面就是把它每一個切割串取出來,看到上面取 level個 ,而這個 level 是個什么東西呢,在這個之前,先看 regexp_count(string, c) 函數(shù),這個函數(shù)其實(shí)很好理解,返回string中c的個數(shù)。
然后就是這個level,這是一個偽列,和RowNum相似,
所以再回到最初的sql,也就很好理解了。
SELECT?REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?1),
REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?2),
REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?3),
DECODE(REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?5),?NULL,?NULL,?REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?4)),
DECODE(REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?5),?NULL,?REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?4),?REGEXP_SUBSTR(t.PATH_IDS||',',?'[^,]+',?1,?5))
FROM?機(jī)構(gòu)層級關(guān)系表?t
前三列根據(jù)正則匹配,獲取對應(yīng)的分割后的值,沒有啥講的,
第四列要判斷是否存在第五列,如果不存在,則第四列要空,存在則用第四列的值
第五列要判斷是否存在第五列,如果不存在,則給第四列的值,存在則用第五列的值
直接使用拼接的方法來解決此問題。
如下參考:
1.新的PHP文件,如下所示。
2.聲明數(shù)組變量,如下圖所示。
3.使用內(nèi)爆函數(shù)將數(shù)組連接到具有連接字符-的字符串中。
4.輸出連接后的字符串,如下圖所示。
5.預(yù)覽效果如圖所示。
6.用implode函數(shù)使數(shù)組拼接成字符串,連接符為?完成如下。