将数据选择到 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 数组中的主要内容,如果未能解决你的问题,请参考以下文章
如何将数组数据保存到 Laravel postgres 中?
使用 postgres 9.4 将 JSON 元素附加到数组