文章詳情頁
Oracle根據逗號拆分字段內容轉成多行的函數說明
瀏覽:62日期:2023-05-30 16:13:59
目錄
- 使用場景
- 1.業務表A
- 2.實現拆分SQL
- 3.REGEXP_SUBSTR函數
- 1)參數說明
- 2)案例
- 4.REGEXP_REPLACE函數
- 1)參數說明
- 5.CONNECT BY函數
- 1)基本語法
- 2)案例
- 6.LENGTH函數
- 1)參數說明
- 2)案例
- 總結
使用場景
業務表A中一個字段存放用逗號分割的多個業務單元,現在需要將數據轉成一個業務單元對應一個數據。
1.業務表A
SELECT * FROM app_template_dept t WHERE t.evaluate_index_code ="3330326";
2.實現拆分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") ACONNECT BY Level<= LENGTH(A.DEPT_CODE) - LENGTH(REGEXP_REPLACE(A.DEPT_CODE, ",", "")) + 1;
3.REGEXP_SUBSTR函數
對字符串進行正則分割,取特定字符的函數。
1)參數說明
REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
- String: 需要進行正則處理的字符串
- pattern:進行匹配的正則表達式
- position:起始位置,從第幾個字符開始正則表達式匹配(默認為1)
注意
:字符串最初的位置是1而不是0 - occurrence:標識第幾個匹配組,默認為1
注意
:分割后最初的字符串會按分割的順序排列成組 - modifier:模式('i’不區分大小寫進行檢索;‘c’區分大小寫進行檢索。默認為’c’。)
注意
:針對的是正則表達式里字符大小寫的匹配
2)案例
/*從第一個字符開始按照字符"A"(區分大小寫)分割字符串"1a2A33a",取第二個分割出來的數據*/SELECT REGEXP_SUBSTR("1a2A33a","[^A]+",1,2,"c") AS STR FROM DUAL; --結果:33aSELECT REGEXP_SUBSTR("1a2A33a","[^A]+",1,2,"i") AS STR FROM DUAL; --結果:2/*把要輸出來的第幾個子串,通過一個變量ROWNUM轉換成輸出多少個子串。level<=5代表的是輸出5個,沒有的為null*/SELECT REGEXP_SUBSTR("1a2A33a","[^A]+",1,Level,"i") AS STR FROM DUAL CONNECT BY LEVEL<=5; --結果:1、2、33、null、null
4.REGEXP_REPLACE函數
通過正則表達式來進行匹配替換。
1)參數說明
REGEXP_REPLACE(VARCHAR str, VARCHAR pattern, VARCHAR replacement)
str:指定的字符串pattern:被替換的字符串replacement:用于替換的字符串 2)案例
SELECT REGEXP_REPLACE("1a2A33a","A","") AS STR FROM DUAL; --結果:1a233a
5.CONNECT BY函數
一般用來查找存在父子關系的數據,也就是樹形結構的數據。
1)基本語法
select ... fromwhere ... --過濾條件,用于對返回的所有記錄進行過濾。[start with ...] --查詢結果重起始根結點的限定條件。connect by [prior] id=parentid--連接條件;
- start with:用來限制第一層的數據,或者叫根節點數據,以這部分數據為基礎來查找第二層數據,然后以第二層數據查找第三層數據以此類推。
- connect by [prior] id=parentid :這部分是用來指明oracle在查找數據時以怎樣的一種關系去查找,比如說查找第二層的數據時用第一層數據的id去跟表里面記錄的parentid字段進行匹配,如果這個條件成立那么查找出來的數據就是第二層數據,同理查找第三層第四層…等等都是按這樣去匹配。
也可以寫成connect by id= [prior] parentid
,這種用法就表示從下往上查找數據,可以理解為從葉子節點往上查找父級幾點,用第一層數據的parentid去跟表記錄里面的id進行匹配,匹配成功那么查找出來的就是第二層數據;上面的那種就是從父級節點往下查找葉子節點。
2)案例
select rownum from dual connect by rownum<=10;
結果
select * from table_tempstart with id = "001001"connect by prior id = parent_id;
table_temp表中數據
結果
6.LENGTH函數
返回字符串表達式中字符數的字符串函數。
1)參數說明
LENGTH(string-expression)
- string-expression:字符串表達式,可以是列名、字符串文字或另一個標量函數的結果,其中基礎數據類型可以表示為任何字符類型(例如 CHAR 或 VARCHAR)
2)案例
SELECT LENGTH("1a2A33a") AS STR FROM DUAL; --結果:7
總結
到此這篇關于Oracle根據逗號拆分字段內容轉成多行的文章就介紹到這了,更多相關Oracle逗號拆分字段內容內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
標簽:
Oracle
排行榜