表A
id data
1 0001
2 0003+0005
3 0006:0008
4 0011+0013:0016+0020要变成
表B
id data
1 0001
2 0003
2 0005
3 0006
3 0007
3 0008
4 0011
4 0013
4 0014
4 0015
4 0016
4 0020 也就是+表示单个的,:表示连续的...想了半天也没想到一个好的解决方案....
id data
1 0001
2 0003+0005
3 0006:0008
4 0011+0013:0016+0020要变成
表B
id data
1 0001
2 0003
2 0005
3 0006
3 0007
3 0008
4 0011
4 0013
4 0014
4 0015
4 0016
4 0020 也就是+表示单个的,:表示连续的...想了半天也没想到一个好的解决方案....
看看下面这种,是不是你想要的
select sjbm,dsbm,qxbm,sum(sb_zzs)
from v_bd
group by sjbm,dsbm,rollup(qxbm);select sjbm,dsbm,qxbm,sum(sb_zzs)
from v_bd
group by sjbm,rollup(dsbm,qxbm);
另外该过程有一个BUG,就是如果 “:”后边的数据小于前边的数据如“0012:0009”将会出错,
你可以加上一个判断
create or replace procedure split_data(p_var varchar) as
v_len number;
v_con number;
v_char varchar2(1);
v_l number;
v_var varchar(4);
begin
v_len := length(p_var);
v_con := mod(v_len,4);
dbms_output.put_line('length: ' || v_len || ' count:' || v_con);
if(v_con > 0) then
for i in 1 .. v_con loop
v_char := substr(p_var,i*5,1);
if(v_char = '+') then
dbms_output.put_line(substr(p_var,(i-1)*5+1,4));
elsif(v_char = ':') then
for j in to_number(substr(p_var,(i-1)*5+1,4)) .. to_number(substr(p_var,i*5+1,4)) loop
v_l := length(to_char(j));
if v_l < 4 then
v_var := to_char(j);
for k in 1 .. 4-v_l loop
v_var := '0' || v_var;
end loop;
dbms_output.put_line(v_var);
else
dbms_output.put_line(j);
end if;
end loop;
end if;
end loop;
else
dbms_output.put_line(p_var);
end if;
end;