Rory Campbell-Lange wrote:
Hi. I'd like to return a result set from a plpgsql function constructed
out of a 'virtual table' joined to an actual table, and struggling to
find a sane approach.

I have a table 'recs' with records like this.

    day |  nums
    -----------
    2   |  1
    5   |  3
    2   |  2.5

For a particular month in the year I would like to generate all the days
in the month into a virtual table.

    'virt'

    vday
    ---
    1
    ... omitted ...
    30

I would like a result set something like this:

    day |  nums
    -----------
    1   |  0
    2   |  3.5
    3   |  0
    4   |  0
    5   |  3
    6   |  0
    ... etc.

You mean like this?

create table recs (day int, nums float);
insert into recs values(2,1);
insert into recs values(5,3);
insert into recs values(2,2.5);

CREATE OR REPLACE FUNCTION generate_series(int, int) RETURNS setof int AS '
 BEGIN
  FOR i IN $1..$2 LOOP
   RETURN NEXT i;
  END LOOP;
  RETURN;
 END;
' LANGUAGE plpgsql;

select f1, sum(coalesce(nums, 0))
from generate_series(1, 6) as t(f1) left join recs on f1 = day
group by f1;
 f1 | sum
----+-----
  1 |   0
  2 | 3.5
  3 |   0
  4 |   0
  5 |   3
  6 |   0
(6 rows)

BTW, as of 8.0.0, generate_series() is built in.

HTH,

Joe

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Reply via email to