[vox-tech] postgres: run function on each row returned from select statement

Harold Lee harold at hotelling.net
Mon Apr 23 15:27:32 PDT 2007


Dylan Beaudette wrote:
> Is there any way to run a function, which expects a single value as an 
> argument, for each row returned from a select statement? Note that this is a 
> special function, used in the following way:
>
> SELECT sum(length(the_geom )) as dist_meters 
> FROM 
> shortest_path_as_geometry('roads', 2192, 154) ;
>
> In the above example the function "shortest_path_as_geometry" expects three 
> arguments... Is there any way to feed a function like this its arguments from 
> column returned from a previous select statement? Or, would this function 
> have to be re-written to allow for this flexibility?
>
> thanks in advance,
>
>   

You question isn't 100% clear to me, but I'm not going to let that stop 
me from opining :-)

Sounds like you have some query that returns (string, roadid1, roadid2) 
and you want to call the shortest_path_as_geometry function on each row 
that comes back from that, then sum the length of those geometries.

Approach #1:

Change the sum_path_as_geometry function to take an array or row instead 
of three value and move the shortest_path_as_geometry function into the 
SELECT list, e.g.

SELECT sum(length(sum_path_as_geometry(a.c1, a.c2, a.c3)))
FROM ( SELECT c1, c2, c3 FROM ... ) a;

Approach #2:

Glue the other query and sum_path_as_geometry together with a new table 
function (i.e. a function that returns a set of rows). Define the new 
function to apply the sum_path_as_geometry function to the appropriate 
rows and then use the new function in your query:

SELECT sum(length(the_geom)) FROM new_function();


More information about the vox-tech mailing list