请教:
    如何在oracle 中添加动态查询字段?
    例如: fromdate , todate
    select id, name from tbl where date between  fromdate and  todate ;
    这里只有两列, fromdate , todate 如果只有一天,就出两列,如果超过一天的话, 就变成
    例如 fromdate 20091102,todate 20091104 这里有三天, 查询的结果想要
    select id,name-20091102,id,name-20091103,id,name-20091104 from tbl 
    这样动态查询的结果?
    也就是把行的结果按照日期拆分成多列的查询方式 , 谢谢!

解决方案 »

  1.   

    只能动态拼sql,要结果也动态不行,因为列是变化的,虽然可以用sys_refcursor传出,但是没法获取。
      

  2.   

    declare
       v_tmp date := fromdate;
       v_sql varchar2(4000) : = 'select ';
    begin
       while v_tmp < todate + 1 loop
          v_sql := v_sql || ' case when date = '||v_tmp||' then id end id, ';
          v_sql := v_sql || ' case when date = '||v_tmp||' then name end name_'||to_char(v_tmp,'yyyymmdd')||' ,';
          v_tmp := v_tmp + 1;
       end loop;
       v_sql := substr(v_sql, 1, length(v_sql)-1) || ' from tbl';
       dbms_output_put_line(v_sql);
    end;
    /看看这个sql是不是你想要的
      

  3.   

    select id,name-20091102,id,name-20091103,id,name-20091104 from tbl 
    这个看着像是楼主想将查询结果分成几列显示,这是若干个查询通过rownum连接的结果了..
      

  4.   

    这个方法我也考虑过, 但是这样拼起来的SQL,最后的结果行数会多出很多行, 例如date1 配对了, 就不会去
    考虑date2,到了date2的时候, 他是接着date1的后面的row的去产生结果 , 这样就做不到
    id name id2 name2 id3 name3
    1  a     2   a     3   a
    11 a     22  a     33  a 
    111a     222 a     333 a
    在同一行中并行多列了.
      

  5.   

    对, 我其实就这个意思, 怎么知道rownum 对应出不同的日期呢?其中有一个字段就是日期的
      

  6.   

    那显示的效果会怎样呢?处理起来很诡异比如1102 2条,1103 3条,1104 4条,处理起来像这样:
    1102  1103  1004
    1      1     1
    1      1     1
           1     1
                 1如果是这样排列的话,有个比较简单的方法是:
    把每天的结果单独查询出来,然后用一个空列rownum来连接,像这样:select id_1102,name_1102,id_1103,name_1103
    from
    (select rownum rn, id_1102,name_1102 from t where date = 1102) t1,
    (select rownum rn, id_1103,name_1103 from t where date = 1103) t3,
    (select rownum rn from dual connect by rownum <= (todate - fromdate) + 1)t0
    where t0.rn = t1.rn(+)
    and t0.rn = t2.rn(+);
      

  7.   

    这个方法可行, 不过我想如果要搜出from date 到to date 有半年长的数据时, sql 的长度不可谓不惊人了,有没有通用一些的好方法呢,头痛哦z~``
      

  8.   

    declare ls_sql1 varchar(2000) := '';
    ls_sql2 varchar(1000) := '';
    ls_dat date := '';
    ls_id  varchar(100):='';
    ls_name varchar(100):='';
    begin
    for mycur in (select dat,id, name from tbl) loop
       
         begin
               --  dbms_output.put_line(mycur.dat);
         
              if ls_dat = mycur.dat then
                 ls_id    := 'id'||'_'||to_char(mycur.dat,'yyyymmdd');
                 ls_name  := 'name'||'_'||to_char(mycur.dat,'yyyymmdd');
                 ls_sql2  := 'insert into tbl_result('||ls_id||','||ls_name||')values('||mycur.id||','||''''||mycur.name||''''||');';
                 dbms_output.put_line(ls_sql2);
                 --exec ls_sql2;
                 
              else
                  ls_id    := 'id'||'_'||to_char(mycur.dat,'yyyymmdd');
                 ls_name  := 'name'||'_'||to_char(mycur.dat,'yyyymmdd');
                 ls_sql1  := 'alter table tbl_result add ('||ls_id||' int'||','||ls_name||' varchar2(10));';
                 ls_sql2  := 'insert into tbl_result('||ls_id||','||ls_name||')values('||mycur.id||','||''''||mycur.name||''''||');';
                 dbms_output.put_line(ls_sql1);
                 dbms_output.put_line(ls_sql2);
                 --exec ls_sql1;
                 --exec ls_sql2;
                 commit;
                 ls_dat := mycur.dat;
                 ls_sql1 := '';
                 ls_sql2 := '';
              end if;
         
         end;
    end loop;end;
      

  9.   

    忘了说明:类似每次数据都增加表的字段,再插入数据,应该还要判断行数,是update数据或者insert
    执行结果类似下面:alter table tbl_result add (id_20010101 int,name_20010101 varchar2(10));
    insert into tbl_result(id_20010101,name_20010101)values(1,'aaa');
    insert into tbl_result(id_20010101,name_20010101)values(2,'bbb');
    alter table tbl_result add (id_20010102 int,name_20010102 varchar2(10));
    insert into tbl_result(id_20010102,name_20010102)values(3,'ccc');
    insert into tbl_result(id_20010102,name_20010102)values(4,'ddd');
    insert into tbl_result(id_20010102,name_20010102)values(5,'eee');
    alter table tbl_result add (id_20010103 int,name_20010103 varchar2(10));
    insert into tbl_result(id_20010103,name_20010103)values(6,'fff');
    insert into tbl_result(id_20010103,name_20010103)values(7,'ggg');