在SQL中以精美打印的格式选择数组

时间:2011-09-29 22:36:56

标签: database arrays parsing postgresql

我正在尝试选择二维整数数组,并将输出定向到文件。有没有什么办法可以编写一个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本身做到这是理想的。

1 个答案:

答案 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