Ich hatte ein Problem in einer Abfrage, wo einer der CTEs keine Zeilen zurückgegeben. Aber das war schwer zu bemerken, und das Debugging dauerte eine ganze Weile.Wie Debuggen allgemeiner Tabellenausdrücke in PostgreSQL?
Ist es möglich, alle CTEs in Postgres auszugeben, ohne die Hauptabfrage auskommentieren zu müssen?
create or replace function generate_grid(
poly geometry, step double precision)
returns setof geometry as
$$ */
with
initial as (select st_xmin(poly) x0, st_ymin(poly) y0),
...(another 3 CTE skipped here)...
grid as (select point from points where st_intersects(point, poly)),
centroid as (select st_centroid(poly) point from grid where (select count(*)=0 from grid))
select * from grid
union all
select * from centroid;
$$ language sql;
Im Beispiel wurde centroid
CTE auf die Funktion schrittweise hinzugefügt, die vor gut funktioniert. Es sollte Zeilen zurückgeben, falls grid
leer ist. Der Fehler (den ich behoben habe) war, dass es nicht, weil es aus dem leeren CTE grid
ausgewählt wurde. Jetzt, als ich das Problem beschrieben habe, ist es offensichtlich, warum es fehlgeschlagen ist, aber wenn Sie es schreiben und debuggen, können alle möglichen Dinge passieren, wie gemischte SRID-Geometrien, falsche SRID, usw.
Warum würden Sie schreiben, so etwas in erster Linie, wenn Sie nicht wissen, was es tut? – joop
@joop Wenn Sie versehentlich einen Fehler machen, wissen Sie immer, was Ihr Programm macht. Es ist ein kleines Detail, das Sie vermissen, dass die Dinge nicht funktionieren. Ich habe die echte Abfrage hinzugefügt, mit der ich gearbeitet habe. –
'... aus dem Raster wo (Anzahl (*) = 0 aus dem Raster wählen))' ist nur schlechte Art, die vermieden werden kann, IMHO. [Ich weiß nicht einmal, ob es eine gültige Syntax ist; Ich würde ein 'NOT EXISTS()' Konstrukt hier IIUC das Fragment verwenden] – joop