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$$;
方案说明
unnest(数组, 维度)可以按指定维度拆分数组,传入1就会把二维数组按第一维度拆分为多个行级子数组,不需要手动遍历- 每个子数组通过
||运算符拼接你需要新增的第二维度元素,补空值直接用array_fill生成对应长度的空值数组即可 - 最后用
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
相关产品推荐
相关产品推荐

