我正在尝试选择二维整数数组,并将输出定向到文件。有没有什么办法可以编写一个postgresql语句,使select语句的输出格式化得很好。在每个整数数组中,作为2D数组的元素是在它自己的行上。
现在我得到这个输出:
SELECT array FROM table LIMIT 1;
{{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}
,{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}
,{0,0,0},{1,1,1},{2,2,2},{3,3,3},{0,0,0},{1,1,1},{2,2,2},{3,3,3}}
我想得到更像这样的东西:
{0,0,0}
{1,1,1}
{2,2,2}
...
我可以在查询返回后进行一些解析,但是如果它可以在Postgres本身做到这是理想的。
答案 0 :(得分:5)
有几种方法。一种方法是将数组转换为文本并使用regexp_split_to_table()将其拆分 此功能存在于 PostgreSQL 8.3或更高版本中。
SELECT regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{');
输出:
0,0,0
1,1,1
2,2,2
如果你想要括号(也许你没有?),请按照以下方式添加它们:
SELECT '{' || regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{') || '}';
Ourtput:
{0,0,0}
{1,1,1}
{2,2,2}
这也适用于 PostgreSQL 8.2 ,甚至可能更早,但我没有测试过。
SELECT my_2d_int_arr_var[x:x][1:3]
FROM (SELECT generate_series(1, array_upper(my_2d_intarr, 1), 1)::int4 AS x)) x
输出:
{{0,0,0}}
{{1,1,1}}
{{2,2,2}}
(您可能想要删除一些大括号..)
否则,我会编写一个循环遍历数组的plpgsql函数。相当容易。
还有相关的unnest()
函数,但每个基本元素返回一行(本例中为整数),所以这里没用。
输出结果的一种(快!)方式:COPY
。