如何合并两条SQL语句,为st_dumppoints传入子查询的shape参数?
原合并写法可行性判断
你当前写的合并SQL不能直接运行,问题出在PostgreSQL/PostGIS的语法规则上:不允许把裸的SELECT子查询直接塞在函数的参数括号里,SQL解析器会直接抛出语法错误。
可行的调整实现
单值固定场景:补全括号的标量子查询入参
只要你的查询条件id = 'test'只会匹配到1条shape记录,给子查询补一层独立的外层圆括号,把它变成合法的单值表达式传入函数即可:
SELECT path[1] AS number, st_x(geom), st_y(geom) FROM st_dumppoints( (SELECT shape FROM tableA WHERE id = 'test') ) AS point_res
注意:如果这个条件后续可能匹配到多行shape值,这个写法会直接报“子查询返回多行”的运行错误,不适合动态变更的查询逻辑。
通用兼容场景:FROM子句横向关联
这是PostGIS拆分几何点最常用的写法,不受匹配行数限制,不管id条件命中1条还是N条shape记录,都能正常完成点拆分,扩展性更强:
SELECT point_res.path[1] AS number, st_x(point_res.geom), st_y(point_res.geom) FROM tableA -- 逐行把当前行的shape值传入st_dumppoints做点拆解 CROSS JOIN LATERAL st_dumppoints(tableA.shape) AS point_res WHERE tableA.id = 'test'
原写法的核心问题
你之前把SELECT shape FROM tableA WHERE id = 'test'直接写在st_dumppoints的参数括号里,没有给整个子查询套外层圆括号,SQL解析器没法识别这是一个用来传参的单值表达式,因此会触发语法报错。哪怕业务上确定子查询只返回单值,缺少这层括号也跑不通。
内容的提问来源于stack exchange,提问作者Software14
相关产品推荐
相关产品推荐

