返回PL / pgsql函数

时间:2016-05-16 10:20:25

标签: postgresql postgis plpgsql

我正在尝试在PL / pgSQL(Postgres 9.5)中创建一个函数(通过动态执行查询),从PostgreSQL / postgis数据库中的两个表(ad和street)返回一些所需的列。表'ad'包含87行,而表'street'包含16,060行。到目前为止我尝试过的是以下代码。此代码的执行时间为2.9秒。我知道可以有许多不同的方法来改善执行时间。这是代码:

Create or Replace Function str_con(ad geometry, street geometry)
Returns Table(address_id integer, address_locations geometry, nearest_streets geometry, traf_speed numeric, street_type character varying) AS $$ Begin
    Return Query 
    Execute 'Select
            address_id,
            address_locations,
            nearest_streets,
            traf_speed,
            street_type

        From
            (
            Select
                ad.gid As address_id,
                ad.geom As address_locations,
                st.geom As nearest_streets,
                st.trafsp As traf_speed,
                st.ospmstty As street_type
            From        
                public.ad, public.st

                Where ST_DWithin(ad.geom, st.geom, 50.0)
                Order By address_id, St_Distance(st.geom, ad.geom)

            ) As foo'; End; $$ Language 'plpgsql';

我正在通过此命令调用该函数。

Select str_con(ad.geom, st.geom) from ad
Join st On st.gid = ad.gid;

两个表'ad'和'street'具有几何列以及感兴趣区域的地址和街道的其他信息。我想将几何和其他列作为输出。但是,我得到这个函数调用的输出:

enter image description here

表示函数返回的是记录集,而不是五个所需的列,这是不需要的。有人可以建议我如何从表格广告和街道返回几何和属性的列?

1 个答案:

答案 0 :(得分:1)

要从记录中获取字段,请使用.后跟字段名称,例如

SELECT (str_con(ad.geom, st.geom)).street_type FROM ...

或使用.*获取记录中的所有字段,例如

SELECT (str_con(ad.geom, st.geom)).* FROM ...