字符串分隔

一、场景,如: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
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值