gelöst:Funktion Setof als Tabelle ausgeben um min/max nutzen zukönnen

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
ballibum
Benutzer
Beiträge: 79
Registriert: Mo 27. Apr 2009, 11:11

gelöst:Funktion Setof als Tabelle ausgeben um min/max nutzen zukönnen

Beitrag von ballibum » Di 21. Mai 2019, 15:42

Hallo Forum,
ich habe eine Tabelle t1 mit Geometrien und führe folgende Funktion aus:

Code: Alles auswählen

Select min(ST_Z(geom)) from t1;
Als Resultat erhalte ich das kleinste Z.

Nun ist das leider nur ein Beispiel um das Problem besser darstellen zu können, denn:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION public.get3dpoints(poly geometry)
    RETURNS SETOF geometry
    LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
 r RECORD;
 l geometry;
BEGIN
    FOR r IN
		Select geomvalue from allpoints(poly) --Returns select statement result
	LOOP
	    Select into l interpolateZ(r.geomvalue); --returns only the geometry
		RETURN NEXT l;
	END LOOP;
END;
$BODY$;
liefert eine Liste von Geometrien.

Code: Alles auswählen

Select geomvalue from allpoints(poly)
splitet eine Geometrie in alle Punkte auf und gibt mir eine Liste mit Geometrien zurück, mit deren Hilfe ich auch den kleinsten Wert herausbekomme.

Code: Alles auswählen

Select into l interpolateZ(r.geomvalue);
Erzeugt mir aus 2D Koordinaten und einem 3D Polygon, den fehlenden Z Wert.

Die daraus entstandene Liste:

"9.54710000000801"
"9.05679999999981"
"9.0784999999993"
"9.06999999997276"
"9.13009999998682"
"9.12579999996163"
"9.54710000000801"

kann ich leider nicht mit min oder max intensiver abfragen:

Code: Alles auswählen

Aufrufe von Aggregatfunktionen können keine Aufrufe von Funktionen mit Ergebnismenge enthalten
Daher hier meine Frage, wie kann ich den obigen Spaß als Tabelle ausgeben, damit Funktionen wie min und max weiterhin funktionieren.
Ich denke das Problem ist, dass die Geometrie nur häppchenweise ausgegeben wird, da in jedem Schleifendurchlauf ein l ausgegeben wird. Ich habe mit RETURN QUERY schon viel versucht, bin aber immer daran gescheitert das l in die temporare tabelle zu stecken.
beste Grüße
Balli
Zuletzt geändert von ballibum am Di 21. Mai 2019, 15:46, insgesamt 1-mal geändert.

ballibum
Benutzer
Beiträge: 79
Registriert: Mo 27. Apr 2009, 11:11

Re: Funktion Setof als Tabelle ausgeben um min/max nutzen zukönnen

Beitrag von ballibum » Di 21. Mai 2019, 15:45

Während des Absendens ist mir noch eine Idee gekommen:

Lösung:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION public.get3dpoints(poly geometry)
    RETURNS table(geoms geometry)
    LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
 r RECORD;
 l geometry;
BEGIN
	drop table t1;
	create temporary table t1 (geom geometry);
    FOR r IN
		Select geomvalue from allpoints(poly) --Returns select statement result
	LOOP
	    Select into l interpolateZ(r.geomvalue); --returns only the geometry
		insert into t1 values (l);
		--INSERT l into t1;
	END LOOP;
	RETURN QUERY 
	Select * from t1;
END;
$BODY$;

Antworten