将数据选择到 Postgres 数组中

Posted

技术标签:

【中文标题】将数据选择到 Postgres 数组中【英文标题】:Selecting data into a Postgres array 【发布时间】:2012-07-30 12:50:38 【问题描述】:

我有以下数据:

name          id             url

John          1              someurl.com
Matt          2              cool.com
Sam           3              ***.com

如何在 Postgres 中编写 SQL 语句,将这些数据选择成多维数组,即:

John, 1, someurl.com, Matt, 2, cool.com, Sam, 3, ***.com

我之前在 Postgres 中看到过这种数组用法,但不知道如何从表中选择数据到这种数组格式。

这里假设所有列的类型都是text

【问题讨论】:

【参考方案1】:

您需要使用aggregate function; array_agg 应该做你需要的。

SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s;

【讨论】:

这个答案返回的是记录数组,而不是多维数组。 是的 - 刚刚开始在上下文中工作,你是对的......我真的需要多维数组! @MattW:我认为你可以得到帮助。 :) 发布了答案。【参考方案2】:

您不能使用array_agg() 来生成多维数组,至少不能达到 PostgreSQL 9.4。 (但即将推出的 Postgres 9.5 提供了一个 new variant of array_agg() 可以!)

您从@Matt Ball's query 得到的是一组记录 (the_table[])。

数组只能包含相同基本类型的元素。你显然有数字和字符串类型。将所有列(尚未)转换为 text 以使其工作。

您可以为此创建一个聚合函数,就像我之前向您展示的 here 一样。

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
   ,STYPE     = anyarray
   ,INITCOND  = ''
);

呼叫:

SELECT array_agg_mult(ARRAY[ARRAY[name, id::text, url]]) AS tbl_mult_arr
FROM   tbl;

注意额外的ARRAY[] 层,使其成为多维数组(准确地说是二维)。

即时演示:

WITH tbl(id, txt) AS (
    VALUES
      (1::int, 'foo'::text)
     ,(2,      'bar')
     ,(3,      'b",') -- txt has meta-characters
    )
    , x AS (
    SELECT array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS t
    FROM   tbl
    )
SELECT *, t[1][3] AS arr_element_1_1, t[3][4] AS arr_element_3_2
FROM   x;

【讨论】:

以上是关于将数据选择到 Postgres 数组中的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 选择中,将列子查询作为数组返回?

如何将数组数据保存到 Laravel postgres 中?

使用 postgres 9.4 将 JSON 元素附加到数组

使用 JDBC 将 CSV 复制到具有自定义类型数组的 Postgres

Postgres选择包含json的json数组中的位置

使用数组搜索 Postgres 数组