请教:
如何在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
这样动态查询的结果?
也就是把行的结果按照日期拆分成多列的查询方式 , 谢谢!
如何在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
这样动态查询的结果?
也就是把行的结果按照日期拆分成多列的查询方式 , 谢谢!
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是不是你想要的
这个看着像是楼主想将查询结果分成几列显示,这是若干个查询通过rownum连接的结果了..
考虑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
在同一行中并行多列了.
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(+);
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;
执行结果类似下面: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');