Database 在SQL中选择打印格式良好的数组

Database 在SQL中选择打印格式良好的数组,database,arrays,parsing,postgresql,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

我试图选择一个二维整数数组,并将输出定向到一个文件。是否有任何方法可以编写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}
...
SELECT '{' || regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{') || '}';

我可以在查询返回后进行一些解析,但如果可以在Postgres本身中进行,那将是理想的

有几种方法。一种方法是将数组强制转换为文本,并用拆分。
此函数出现在PostgreSQL 8.3或更高版本中

SELECT regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{');
输出:

0,0,0
1,1,1
2,2,2
{{0,0,0}}
{{1,1,1}}
{{2,2,2}}
如果您想要包含括号(可能不需要?),请按如下方式将其添加回:

{0,0,0}
{1,1,1}
{2,2,2}
...
SELECT '{' || regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{') || '}';
我们的输出:

{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
{{0,0,0}}
{{1,1,1}}
{{2,2,2}}
(您可能需要去掉一些花括号…)

否则,我将编写一个plpgsql函数,在数组中循环。相当容易

还有相关的函数,但它会为每个基本元素返回一行(在本例中为整数),因此在这里没有任何用处


一种(快速!)输出结果的方法:。

有几种方法。一种方法是将数组强制转换为文本,并用拆分。
此函数出现在PostgreSQL 8.3或更高版本中

SELECT regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{');
输出:

0,0,0
1,1,1
2,2,2
{{0,0,0}}
{{1,1,1}}
{{2,2,2}}
如果您想要包含括号(可能不需要?),请按如下方式将其添加回:

{0,0,0}
{1,1,1}
{2,2,2}
...
SELECT '{' || regexp_split_to_table(trim(my_2d_intarr::text, '{}'), '},{') || '}';
我们的输出:

{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
{{0,0,0}}
{{1,1,1}}
{{2,2,2}}
(您可能需要去掉一些花括号…)

否则,我将编写一个plpgsql函数,在数组中循环。相当容易

还有相关的函数,但它会为每个基本元素返回一行(在本例中为整数),因此在这里没有任何用处


一种(快速!)输出结果的方法:。

+1感谢您提出了一个非常清晰的问题,并提供了一个工作示例和演示输出。让回答变得容易多了!除非您在postgresql中使用复合数据类型(如
array
),否则最好在应用程序代码中使用复合数据类型,而不是将数据库与字符串解析捆绑在一起,特别是如果您将使用整列值作为最终输出。另一方面,postgres本身非常精通字符串处理。因此,在某些情况下,这当然是一个选项。+1感谢您提出了一个非常清晰的问题,并提供了一个工作示例和演示输出。让回答变得容易多了!除非您在postgresql中使用复合数据类型(如
array
),否则最好在应用程序代码中使用复合数据类型,而不是将数据库与字符串解析捆绑在一起,特别是如果您将使用整列值作为最终输出。另一方面,postgres本身非常精通字符串处理。因此,在某些情况下,这当然是一种选择。