最近遇到一個問題,須要把一個帶有,的字符串拆分紅多列。經過查詢資料,這個操做須要使用如下2個關鍵知識:正則表達式
1. REGEXP_SUBSTR函數函數
這個函數的做用是正則分隔字符串,用法爲regexp
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)blog
__srcstr :須要進行正則處理的字符串字符串
__pattern :進行匹配的正則表達式it
__position :起始位置,從第幾個字符開始正則表達式匹配(默認爲1)io
__occurrence :標識第幾個匹配組,默認爲1function
__modifier :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。默認爲'c'。)select
舉幾個例子說明下這個函數的用法:im
select regexp_substr('1,2,3','[^,]+',1,1) result from dual;
執行結果:
select regexp_substr('1,2,3','[^,]+',1,2) result from dual;
執行結果:
可見occurrence參數用來指定要提取第幾個匹配到的數據。以字符串'1,2,3'爲例,這個參數分別要爲1,2,3。
2.爲了實現動態參數,使用 connect by
舉個例子:
select rownum from dual connect by rownum<=7;
執行結果:
可見經過connect by能夠構造連續的值
3.字符串中逗號的數量是不肯定的,若是有2個逗號,須要提取的字段就是3個。爲了肯定有多少個須要提取的字段,使用regexp_replace函數
舉個列子:
select regexp_replace('1,2,3',',','') from dual;
執行結果:
可見執行正則替換後,字符串中的,被刪除了。經過原字符串長度和被替換後字符串長度相減,能夠獲得原字符串中的逗號數量,加1後獲得須要提取的匹配字段數量
最終的語句爲:
SELECT REGEXP_SUBSTR ('1,2,3', '[^,]+', 1,rownum)
from dual connect by rownum<=LENGTH ('1,2,3') - LENGTH (regexp_replace('1,2,3', ',', ''))+1;
執行結果: