一、场景,如:86134-86139;86158
分隔成:
86134
86135
86136
86137
86138
86139
86158
解决方案:
1、
CREATE OR REPLACE TYPE split_type IS TABLE OF VARCHAR2 (4000);
2、
CREATE OR REPLACE FUNCTION split ( p_str IN VARCHAR2, --传入字符串如:86134-86138 p_delimiter IN VARCHAR2 default(','), --分隔符,默认逗号 p_join IN VARCHAR2 default('-') --连接符,默认减号 ) RETURN split_type IS join_index INT :=0; --如86134-86138 -的索引 j INT := 0; --;所有的索引 i INT := 1; --开始索引 len INT := 0; len1 INT := 0; str VARCHAR2 (4000); my_split split_type := split_type (); BEGIN len := LENGTH (p_str); len1 := LENGTH (p_delimiter); WHILE j < len LOOP j := INSTR (p_str, p_delimiter, i); IF j = 0 THEN j := len; str := SUBSTR (p_str, i); join_index:=INSTR(str,p_join); /****判断prefix中是否存在减号*******/ if join_index=0 --没有连续号,直接插入 then my_split.EXTEND; my_split (my_split.COUNT) := str; else --有连续号,分开插入 For v In SUBSTR(str,1,join_index-1)..SUBSTR(str,join_index+1) Loop --Dbms_Output.Put_Line(v); my_split.EXTEND; my_split (my_split.COUNT) := v; end loop; end if; IF i >= len THEN EXIT; END IF; ELSE str := SUBSTR (p_str, i, j - i); i := j + len1; join_index:=INSTR(str,p_join); /****判断prefix中是否存在减号*******/ if join_index=0 --没有连续号,直接插入 then my_split.EXTEND; my_split (my_split.COUNT) := str; else --有连续号,分开插入 For v In SUBSTR(str,1,join_index-1)..SUBSTR(str,join_index+1) Loop --Dbms_Output.Put_Line(v); my_split.EXTEND; my_split (my_split.COUNT) := v; end loop; end if; END IF; END LOOP; RETURN my_split; END split; /
3、测试:
select * from table (split('86158;86134-86139;86182;',';','-'));
4、结果:
86158 86134 86135 86136 86137 86138 86139 86182