Oracle根據(jù)逗號拆分字段內(nèi)容轉(zhuǎn)成多行的函數(shù)說明
使用場景
業(yè)務(wù)表A中一個(gè)字段存放用逗號分割的多個(gè)業(yè)務(wù)單元,現(xiàn)在需要將數(shù)據(jù)轉(zhuǎn)成一個(gè)業(yè)務(wù)單元對應(yīng)一個(gè)數(shù)據(jù)。
1.業(yè)務(wù)表A
SELECT * FROM app_template_dept t WHERE t.evaluate_index_code ='3330326';
2.實(shí)現(xiàn)拆分SQL
SELECT DISTINCT A.*, REGEXP_SUBSTR(A.DEPT_CODE, '[^,]+', 1, Level, 'i') FROM (SELECT * FROM APP_TEMPLATE_DEPT T WHERE T.EVALUATE_INDEX_CODE = '3330326') A CONNECT BY Level<= LENGTH(A.DEPT_CODE) - LENGTH(REGEXP_REPLACE(A.DEPT_CODE, ',', '')) + 1;
3.REGEXP_SUBSTR函數(shù)
對字符串進(jìn)行正則分割,取特定字符的函數(shù)。
1)參數(shù)說明
REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
- String: 需要進(jìn)行正則處理的字符串
- pattern:進(jìn)行匹配的正則表達(dá)式
- position:起始位置,從第幾個(gè)字符開始正則表達(dá)式匹配(默認(rèn)為1)
注意
:字符串最初的位置是1而不是0 - occurrence:標(biāo)識第幾個(gè)匹配組,默認(rèn)為1
注意
:分割后最初的字符串會按分割的順序排列成組 - modifier:模式('i’不區(qū)分大小寫進(jìn)行檢索;‘c’區(qū)分大小寫進(jìn)行檢索。默認(rèn)為’c’。)
注意
:針對的是正則表達(dá)式里字符大小寫的匹配
2)案例
/*從第一個(gè)字符開始按照字符'A'(區(qū)分大小寫)分割字符串'1a2A33a',取第二個(gè)分割出來的數(shù)據(jù)*/ SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,2,'c') AS STR FROM DUAL; --結(jié)果:33a SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,2,'i') AS STR FROM DUAL; --結(jié)果:2 /*把要輸出來的第幾個(gè)子串,通過一個(gè)變量ROWNUM轉(zhuǎn)換成輸出多少個(gè)子串。level<=5代表的是輸出5個(gè),沒有的為null*/ SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,Level,'i') AS STR FROM DUAL CONNECT BY LEVEL<=5; --結(jié)果:1、2、33、null、null
4.REGEXP_REPLACE函數(shù)
通過正則表達(dá)式來進(jìn)行匹配替換。
1)參數(shù)說明
REGEXP_REPLACE(VARCHAR str, VARCHAR pattern, VARCHAR replacement)
str:指定的字符串pattern:被替換的字符串replacement:用于替換的字符串 2)案例
SELECT REGEXP_REPLACE('1a2A33a','A','') AS STR FROM DUAL; --結(jié)果:1a233a
5.CONNECT BY函數(shù)
一般用來查找存在父子關(guān)系的數(shù)據(jù),也就是樹形結(jié)構(gòu)的數(shù)據(jù)。
1)基本語法
select ... from where ... --過濾條件,用于對返回的所有記錄進(jìn)行過濾。 [start with ...] --查詢結(jié)果重起始根結(jié)點(diǎn)的限定條件。 connect by [prior] id=parentid--連接條件 ;
- start with:用來限制第一層的數(shù)據(jù),或者叫根節(jié)點(diǎn)數(shù)據(jù),以這部分?jǐn)?shù)據(jù)為基礎(chǔ)來查找第二層數(shù)據(jù),然后以第二層數(shù)據(jù)查找第三層數(shù)據(jù)以此類推。
- connect by [prior] id=parentid :這部分是用來指明oracle在查找數(shù)據(jù)時(shí)以怎樣的一種關(guān)系去查找,比如說查找第二層的數(shù)據(jù)時(shí)用第一層數(shù)據(jù)的id去跟表里面記錄的parentid字段進(jìn)行匹配,如果這個(gè)條件成立那么查找出來的數(shù)據(jù)就是第二層數(shù)據(jù),同理查找第三層第四層…等等都是按這樣去匹配。
也可以寫成connect by id= [prior] parentid
,這種用法就表示從下往上查找數(shù)據(jù),可以理解為從葉子節(jié)點(diǎn)往上查找父級幾點(diǎn),用第一層數(shù)據(jù)的parentid去跟表記錄里面的id進(jìn)行匹配,匹配成功那么查找出來的就是第二層數(shù)據(jù);上面的那種就是從父級節(jié)點(diǎn)往下查找葉子節(jié)點(diǎn)。
2)案例
select rownum from dual connect by rownum<=10;
結(jié)果
select * from table_temp start with id = '001001' connect by prior id = parent_id;
table_temp表中數(shù)據(jù)
結(jié)果
6.LENGTH函數(shù)
返回字符串表達(dá)式中字符數(shù)的字符串函數(shù)。
1)參數(shù)說明
LENGTH(string-expression)
- string-expression:字符串表達(dá)式,可以是列名、字符串文字或另一個(gè)標(biāo)量函數(shù)的結(jié)果,其中基礎(chǔ)數(shù)據(jù)類型可以表示為任何字符類型(例如 CHAR 或 VARCHAR)
2)案例
SELECT LENGTH('1a2A33a') AS STR FROM DUAL; --結(jié)果:7
總結(jié)
到此這篇關(guān)于Oracle根據(jù)逗號拆分字段內(nèi)容轉(zhuǎn)成多行的文章就介紹到這了,更多相關(guān)Oracle逗號拆分字段內(nèi)容內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ORACLE應(yīng)用經(jīng)驗(yàn)(1)
ORACLE應(yīng)用經(jīng)驗(yàn)(1)...2007-03-03oracle臨時(shí)表空間的作用與創(chuàng)建及相關(guān)操作詳解
Oracle可能會需要使用到一些臨時(shí)存儲空間,用于臨時(shí)保存解析過的查詢語句以及在排序過程中產(chǎn)生的臨時(shí)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于oracle臨時(shí)表空間的作用與創(chuàng)建及相關(guān)操作的相關(guān)資料,需要的朋友可以參考下2022-07-07Oracle cloud control 12c的啟動、關(guān)閉及獲取安裝信息的方法
這篇文章主要介紹了Oracle cloud control 12c的啟動、關(guān)閉及獲取安裝信息的方法,例如獲取安裝時(shí)設(shè)定的各類端口號,URL以及如何啟動、關(guān)閉cloud control等等,需要的朋友可以參考下2014-11-11連接Oracle數(shù)據(jù)庫時(shí)報(bào)ORA-12541:TNS:無監(jiān)聽程序的圖文解決教程
這篇文章主要介紹了連接Oracle數(shù)據(jù)庫時(shí)報(bào)ORA-12541:TNS:無監(jiān)聽程序的圖文解決教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08oracle join on 數(shù)據(jù)過濾問題
因?yàn)樵贔OR .. IN () LOOP 游標(biāo)中使用 所以不能采用下面的查詢語句做游標(biāo)2009-07-07window10 安裝Oracle19C 和SQL Developer 的圖文教程
這篇文章主要介紹了window10 安裝Oracle19C 和SQL Developer 教程(圖文詳解),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03