我表tabl文件里有两列数据,格式如下: 
23   aa 
3456 bb 
..... 
我现在想把第一列的数据补足为7位(可能第一列的初始数据只有2位或3位、4位、5位等),且补后的数据,生成的新的列数据,是依次从小到大,第2列数据不变。 
结果如下: 1230000  aa 
1230001  aa 
1230002  aa 
...... 
1239999  aa 3456000  bb 
3456001  bb 
3456002  bb 
...... 
3456999  bb ...... 请问如何用sql 语句实现

解决方案 »

  1.   

    你是要求前后都补齐还是只保证七位,不够的话补后面?
    描述的不清楚。无法解答。如果只需要保证七位不够后补可以使用RPAD函数和自己带的rownum做。
    如果前面也要按大小补齐估计最好写一个函数判断了。也可以试一试CASE语句和RPAD或者LPAD结合试一试!
      

  2.   

    是后边补齐!
    关键是如何用RPAD函数和rownum结合起来用,可否简单示范下!
      

  3.   

    不好意思没有注意看。你的是文件。可以使用外表表。
    我下面语句针对的是从表里面提取的语句:
    SELECT b.constraint_type||LPad(rownum,7-length(b.constraint_type),'0')
     FROM USER_CONS_COLUMNS A,USER_CONSTRAINTS B WHERE A.constraint_name=B.constraint_name
    可以参考一下我上面的语句凑够7位数。
      

  4.   

    请问下:USER_CONS_COLUMNS 和USER_CONSTRAINTS 表是那里的,是系统自己的,还是要自己建立的?
      

  5.   

    select 字段1||lpad(rownum,7-length(字段1),'0') from tabl;
    如果你只要右补齐的话应该可以了,不知道你是不是这个意思。
      

  6.   

    declare
    v_sqlstring varchar2(1024);
    v_a         number:=0;
    v_b         varchar2(2);
    t           number:=9;
    cursor my_cur is select * from test_csdn;
    begin
     v_sqlstring :='insert into test_csdn1 values(:a,:b)';
    open my_cur;
    loop
    fetch my_cur into v_a,v_b;
    exit when my_cur%notfound;
         for x in 1..7-length(v_a) loop
         t:=9||t;   --tab1每条记录扩充成多少条tab2的记录
         end loop;
    for i in 0..t loop
      execute immediate v_sqlstring using v_a||lpad(i,7-length(v_a),0),v_b;
    end loop;
    end loop;
    commit;
    close  my_cur;
    end;
    /