PostgreSQL中WITH结构如何将列转为数组供pgr_dijkstraVia调用
问题原因
报错的核心原因是:nodes是你定义的公共表表达式(CTE),本质是临时结果集,不能直接作为函数参数传入;同时你之前的array_agg写法没有将聚合结果提取为单个标量值,无法匹配pgr_dijkstraVia的入参要求。
解决方案
两种常用写法都可以实现需求:
写法1:直接嵌套子查询(更简洁)
不需要单独定义nodes CTE,直接在函数参数位置聚合数组:
WITH res AS ( SELECT * ... -- 保留你原来的res查询逻辑 ), viapath AS ( SELECT * FROM pgr_dijkstraVia( 'SELECT id, source, target, cost FROM edge_net', (SELECT array_agg(node) FROM res) ) ) SELECT * FROM viapath;
这里(SELECT array_agg(node) FROM res)会将res中所有node列的值聚合为单个一维整数数组,和你直接写array[54, 37, 897, 435]的效果完全一致。
写法2:保留nodes CTE
如果你需要复用nodes的结果,可以按如下方式改写:
WITH res AS ( SELECT * ... -- 保留你原来的res查询逻辑 ), nodes AS ( SELECT array_agg(node) AS node_arr FROM res -- 给聚合后的数组设置别名 ), viapath AS ( SELECT * FROM pgr_dijkstraVia( 'SELECT id, source, target, cost FROM edge_net', (SELECT node_arr FROM nodes) -- 从nodes中提取单值数组作为参数 ) ) SELECT * FROM viapath;
注意事项
如果路径计算对节点顺序有要求,记得在array_agg中指定排序规则,避免数组顺序随机导致结果不符合预期,示例:array_agg(node ORDER BY node_id ASC)
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

