oracle如何拆分以逗號分隔的字串為多列?
最近遇到一個問題,需要把一個帶有,的字串拆分成多列。通過查詢資料,這個操作需要使用以下2個關鍵知識:
1. REGEXP_SUBSTR函式
這個函式的作用是正則分隔字串,用法為
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要進行正則處理的字串
__pattern :進行匹配的正則表示式
__position :起始位置,從第幾個字元開始正則表示式匹配(預設為1)
__occurrence :標識第幾個匹配組,預設為1
__modifier :模式('i'不區分大小寫進行檢索;'c'區分大小寫進行檢索。預設為'c'。)
舉幾個例子說明下這個函式的用法:
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;
執行結果: