ARRAY は同じ型の要素のみを保持できます
あなたの例は atext
とinteger
値を表示します( を一重引用符で囲みません1
)。通常、配列内で型を混在させることはできません。これらの値を配列に取得するには、composite type
既に述べたように、その複合型の ARRAY を作成してから形成する必要があります。
またはjson
、Postgres 9.2 以降jsonb
、Postgres 9.4 以降、またはhstore
キーと値のペアのデータ型を使用できます
もちろん、 を にキャストしinteger
てtext
、2 次元テキスト配列を操作できます。以下のデモで配列入力の 2 つの構文バリアントを検討し、配列入力に関するマニュアルを参照してください。
克服すべき限界があります。ARRAY (キーと値から構築) を 2 次元配列に集約しようとすると、集約関数array_agg()
またはARRAY
コンストラクターでエラーが発生します。
ERROR: could not find array type for data type text[]
ただし、それを回避する方法はあります。
キーと値のペアを 2 次元配列に集約する
PostgreSQL 9.1 とstandard_conforming_strings= on
:
CREATE TEMP TABLE tbl(
id int
,txt text
,txtarr text[]
);
この列txtarr
は、INSERT コマンドの構文バリアントを示すためのものです。3 番目の行には、メタ文字がスパイクされています。
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;
単純なケース: 2 つの整数 (同じものを 2 回使用) を 2 次元の 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)
...
1 つ高い次元の配列に連結された入力配列 (入力はすべて同じ次元でなければならず、空または NULL にすることはできません)