2016-05-16 11 views
0

Ich versuche, eine Funktion in PL/pgSQL (Postgres 9.5) zu erstellen (durch dynamische Ausführung einer Abfrage), um einige gewünschte Spalten aus zwei Tabellen (Anzeige und Straße) in PostgreSQL/postgis Datenbank. Tabelle 'ad' enthält 87 Zeilen, während Tabelle 'street' 16.060 Zeilen enthält. Was ich bisher versucht habe, ist durch folgenden Code gegeben. Die Ausführungszeit für diesen Code beträgt 2,9 Sekunden. Mir ist bewusst, dass es viele verschiedene Möglichkeiten gibt, die Ausführungszeit zu verbessern. Hier ist der Code:Rückgabe sowohl der Geometrie als auch anderer Attribute Spalten in PL/pgsql Funktion

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'; 

Ich rufe die Funktion mit diesem Befehl.

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

Die ‚ad‘ zwei Tabellen und ‚Straße‘ hat Geometriespalten sowie andere Informationen von Adressen und Straßen der Region von Interesse. Ich möchte sowohl Geometrie als auch andere Spalten als Ausgabe erhalten. Aber ich bin immer die Ausgabe dieser Funktion Aufruf wie folgt:

enter image description here

ist die Funktion die Datensätze statt fünf gewünschten Spalten zurückgibt, die nicht erforderlich ist. Kann mir bitte jemand sagen, wie man die Spalten der Geometrie und der Attribute aus den Tabellen ad und street zurückgibt?

Antwort

1

Um ein Feld aus einem Datensatz zu erhalten, verwenden Sie . gefolgt von dem Feldnamen, z.

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

oder alle Felder aus dem Datensatz erhalten mit .*, z.B.

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

Vielen Dank! löste mein Problem. –