我在查询中遇到问题,其中一个CTE没有返回任何行。但是这很难被注意到,并且在很短的时间内调试了一段时间。如何在PostgreSQL中调试公用表表达式?
是否有可能在Postgres中输出所有CTE,而不会注释掉主要查询?
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;
在该示例中,CTE centroid
要逐步增量添加到之前运作良好的功能。它应该返回行,以防grid
为空。该错误(,我已经修复)是它没有,因为它从空CTE grid
中选择。现在,当我描述问题时,很明显它为什么会失败,但是当您编写它并进行调试时,可能会发生各种各样的事情,例如混合几何体SRID,错误的SRID等。
你为什么会写这样的事情摆在首位,如果你不知道是什么它呢? – joop
@joop当你不小心发出错误时,你总是知道你的程序在做什么。这是一个小的细节,你失踪,使事情无法正常工作。我添加了与之合作的真实查询。 –
'...从网格哪里(选择计数(*)= 0从网格))'只是不好的风格,这是可以避免的,恕我直言。 [我甚至不知道它是否是有效的语法;我会在这里使用'NOT EXISTS()'构造IIUC这个片段] – joop