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

Postgresql PL/pgSQL如何扩展未知长度二维数组的第二维度

高效简洁的内置实现方案

PostgreSQL 内置的带维度unnest+array_agg组合可以直接实现第二维度扩展,全程走C语言实现的内置函数,无需双重循环,性能远高于PL/pgSQL遍历方案,代码也更简洁:

DO 
$$declare
    p_StrArr text[][];
begin
    p_StrArr:=array[['a1', 'b1', 'c1'], ['a2', 'b2', 'c2'] ];
    raise notice '扩展前数组:%', p_StrArr; 
    -- 核心扩展逻辑:给第二维度新增1列空值,需新增多列修改array_fill的第二个参数即可
    p_StrArr := (
        SELECT array_agg(row_arr || array_fill(null::text, array[1])) 
        FROM unnest(p_StrArr, 1) row_arr
    );
    -- 给新扩展的列赋值
    p_StrArr[1][4] := 'd1';
    raise notice '扩展后数组:%', p_StrArr; 
    raise notice '第一维度长度:%', array_length(p_StrArr,1); 
    raise notice '第二维度长度:%', array_length(p_StrArr,2); 
END$$;

方案说明

  1. unnest(数组, 维度) 可以按指定维度拆分数组,传入1就会把二维数组按第一维度拆分为多个行级子数组,不需要手动遍历
  2. 每个子数组通过||运算符拼接你需要新增的第二维度元素,补空值直接用array_fill生成对应长度的空值数组即可
  3. 最后用array_agg把处理后的子数组合并为二维数组,无需手动创建临时数组

扩展用法

如果需要给新增的列直接赋值自定义内容,而非空值,可以按如下写法实现:

-- 给新增的第4列分别赋值d1、d2
p_StrArr := (
    SELECT array_agg(row_arr.val || add_col.val) 
    FROM unnest(p_StrArr, 1) WITH ORDINALITY row_arr(val, idx)
    JOIN unnest(array['d1','d2']::text[]) WITH ORDINALITY add_col(val, idx)
    ON row_arr.idx = add_col.idx
);

内容的提问来源于stack exchange,提问作者MichaelN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:27:03