ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 列转行一则

列转行一则

原创 Linux操作系统 作者:lnwxzyp 时间:2013-07-04 12:31:17 0 删除 编辑
    今天遇到个地市的人,让我给搞一个列专行的东东出来,大致数据如下:
create table test_zyp (col1 varchar2(1000)) nologging;
insert into test_zyp values ('自贡市雨城区张飞街成都二中学校新教学楼FTTB-LAN,自贡市雨城区张飞街成都二中学校新教学楼5楼FTTB-LAN,自贡市雨城区张飞街成都二中学校新教学楼4楼FTTB-LAN,自贡市雨城区张飞街成都二中学校新教学楼2楼FTTB-LAN,自贡市雨城区张飞街成都二中学校新教学楼3楼FTTB-LAN');
commit;
按照逗号作为分隔符,每一个地址一行。
set serveroutput on
declare v_int int;
v_char varchar2(1000);
begin
select length2(col1)
-
length2(replace(col1,',','')) into v_int from test_zyp;
select substr2(col1,1,instr2(col1,',',1,1)-1) into v_char from test_zyp; 
/*第一个逗号之前的地址单独用一个sql来处理*/
dbms_output.put_line(v_char);
for i in 1..v_int loop
select substr2(col1,
               instr2(col1,',',1,i)+1,  /*右括弧加1表示从逗号后的字符开始截取*/
               decode(i,v_int,(length2(col1)-instr2(col1,',',1,i)),(instr2(col1,',',1,i+1)-instr2(col1,',',1,i)-1))) into v_char from test_zyp;
/*decode 表示如果i是最大值按v_int后的方法最大长度减去最大一个逗号的长度来处理,否则按后一个逗号减去前一个逗号来计算长度*/
dbms_output.put_line(v_char);
end loop;
end;
/
自贡市雨城区张飞街成都二中学校新教学楼FTTB-LAN
自贡市雨城区张飞街成都二中学校新教学楼5楼FTTB-LAN
自贡市雨城区张飞街成都二中学校新教学楼4楼FTTB-LAN
自贡市雨城区张飞街成都二中学校新教学楼2楼FTTB-LAN
自贡市雨城区张飞街成都二中学校新教学楼3楼FTTB-LAN


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12216142/viewspace-765465/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 换行符和回车符
请登录后发表评论 登录
全部评论

注册时间:2008-04-25

  • 博文量
    129
  • 访问量
    673885