select数据到Postgres数组
我有以下数据:
name id url John 1 someurl.com Matt 2 cool.com Sam 3 stackoverflow.com
我怎样才能在Postgres中编写一个SQL语句来select这个数据到一个multidimensional array中,例如:
{{John, 1, someurl.com}, {Matt, 2, cool.com}, {Sam, 3, stackoverflow.com}}
我以前在Postgres中已经看到过这种数组用法,但是不知道如何从表中select数据到这种数组格式。
假设这里所有的列都是text
types的。
你不能使用array_agg()
来产生multidimensional array,至less不能达到PostgreSQL 9.4。
(但即将发布的Postgres 9.5发布了一个新的array_agg()
变体 !)
你从@Mat球的查询中得到的是一组logging( the_table[]
)。
数组只能容纳相同基本types的元素。 你显然有数字和stringtypes。 将所有列(尚未)转换为text
以使其工作。
您可以为此创build一个聚合函数,就像我以前在这里演示的那样。
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[]
图层使其成为一个multidimensional 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;
你需要使用一个聚合函数 ; array_agg
应该做你需要的。
SELECT array_agg(s) FROM (SELECT name, id, url FROM the_table ORDER BY id) AS s;