You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:06:02