1.情景展示
在oracle當中,如何拆分以逗號隔開的字符串?(將字符串按指定字符拆分成多行數據)
比如:411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681。
2.具體分析
oracle當中沒有專門的字符串拆分函數;
但是,我們可以通過REGEXP_SUBSTR()和CONNECT BY LEVEL來實現。
如果,需要自定義創建split函數的話,見文末推薦。
3.解決方案
語法:
SELECT REGEXP_SUBSTR(string,
'[^特定字符]+',
1,
LEVEL,
'i') as 分割后結果
FROM DUAL
CONNECT BY LEVEL <= 特定字符在字符串當中出現的次數 + 1;
進一步優化
SELECT REGEXP_SUBSTR(string,
'[^特定字符]+',
1,
LEVEL,
'i') as 起個別名
FROM DUAL
CONNECT BY LEVEL <= LENGTHB(TRANSLATE(string, '特定字符' || string, '特定字符')) + 1;
查看代碼
SELECT REGEXP_SUBSTR('411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681',
'[^,]+',
1,
LEVEL,
'i') as 分割后結果
FROM DUAL
CONNECT BY LEVEL <= LENGTHB(TRANSLATE('411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681', ',' || '411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681', ',')) + 1;
SELECT REGEXP_SUBSTR('411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681',
'[^,]+',
1,
LEVEL,
'i') as 分割后結果
FROM DUAL
CONNECT BY LEVEL <= LENGTHB(TRANSLATE('411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681',
',' ||
'411600,411602,411603,411606,411609,411621,411622,411623,411624,411625,411626,411627,411628,411643,411681',
',')) + 1;