ARRAY 只能容纳相同类型的元素
您的示例显示 atext
和一个integer
值(周围没有单引号1
)。通常不可能在数组中混合类型。要将这些值放入数组中,您必须创建一个composite type
然后形成该复合类型的 ARRAY,就像您自己已经提到的那样。
或者,您可以使用 Postgres 9.2+、Postgres 9.4+ 中的数据类型json
或jsonb
键值hstore
对。
当然,您可以强制integer
转换为text
,并使用二维文本数组。考虑下面演示中数组输入的两种语法变体,并查阅有关数组输入的手册。
有一个限制需要克服。如果您尝试将 ARRAY(从键和值构建)聚合到二维数组中,聚合函数array_agg()
或ARRAY
构造函数会出错:
ERROR: could not find array type for data type text[]
不过,有一些方法可以解决它。
将键值对聚合成二维数组
PostgreSQL 9.1 与standard_conforming_strings= on
:
CREATE TEMP TABLE tbl(
id int
,txt text
,txtarr text[]
);
该列txtarr
只是为了演示 INSERT 命令中的语法变体。第三行添加了元字符:
INSERT INTO tbl VALUES
(1, 'foo', '{{1,foo1},{2,bar1},{3,baz1}}')
,(2, 'bar', ARRAY[['1','foo2'],['2','bar2'],['3','baz2']])
,(3, '}b",a{r''', '{{1,foo3},{2,bar3},{3,baz3}}'); -- txt has meta-characters
SELECT * FROM tbl;
简单案例:将两个整数(我用了两次相同)聚合成一个二维 int 数组:
更新:使用自定义聚合函数更好
使用多态类型anyarray
,它适用于所有基本类型:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
称呼:
SELECT array_agg_mult(ARRAY[ARRAY[id,id]]) AS x -- for int
,array_agg_mult(ARRAY[ARRAY[id::text,txt]]) AS y -- or text
FROM tbl;
请注意附加ARRAY[]
层以使其成为多维数组。
Postgres 9.5+ 的更新
Postgres 现在提供了一个array_agg()
接受数组输入的变体,你可以从上面替换我的自定义函数:
手册:
array_agg(expression)
...
输入数组连接成一个更高维度的数组(输入必须都具有相同的维度,并且不能为空或 NULL)