Postgres9.5以降
...集計関数array_agg()
の追加のバリアントが付属しています 。マニュアル:
1つの高次元の配列に連結された入力配列(入力はすべて同じ次元である必要があり、空またはnullにすることはできません)
したがって、カスタム集計関数array_agg_mult()
とまったく同じではありません。 下。ただし、可能であればそれを使用してください。より高速です。
関連:
- PostgreSQLで2次元のint配列を並べ替える方法は?
Postgres9.4以前
anyの集計関数 配列型
ポリモーフィックタイプanyarray
あらゆる種類の配列(integer[]
を含む)で機能します ):
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
, STYPE = anyarray
, INITCOND = '{}'
);
@Lukasが提供したように、カスタム関数arrayappend()
必要ありません。組み込みのarray_cat()
仕事をします。しかし、それは理由を説明していません あなたの例は失敗しますが、Lukasの答えの例は機能します。関連する違いは、Lukasがarray[d.a]
を使用して配列を別の配列レイヤーにネストしたことです。 。
タイプint[][]
を宣言できるという誤った仮定につまずきます 。ただし、次のことはできません:int[][]
同じタイプです int[]
として PostgreSQL型システムの場合。マニュアルのアレイタイプに関する章では、次のように説明しています。
現在の実装では、宣言されたディメンションの数も強制されません。特定の要素タイプの配列は、サイズや次元数に関係なく、すべて同じタイプであると見なされます。したがって、
CREATE TABLE
で配列のサイズまたは次元数を宣言します。 単なるドキュメントです。実行時の動作には影響しません。
n
-次元整数配列は事実上n-1
の配列です -PostgreSQLの整数の次元配列。 基本要素のみを定義するタイプからはわかりません。 。 array_dims()
に問い合わせる必要があります 詳細を取得します。
デモンストレーション:
SELECT array_agg_mult(arr1) AS arr1 --> 1-dim array
, array_agg_mult(ARRAY[arr1]) AS arr2 --> 2-dim array
, array_agg_mult(ARRAY[ARRAY[arr1]]) AS arr3 --> 3-dim array
-- etc.
FROM (
VALUES
('{1,2,3}'::int[]) -- 1-dim array
, ('{4,5,6}')
, ('{7,8,9}')
) t(arr1);
または:
SELECT array_agg_mult(arr2) AS arr2 --> 2-dim array
, array_agg_mult(ARRAY[arr2]) AS arr3 --> 3-dim array
, array_agg(arr2) AS arr3 --> 3-dim array; superior in Postgres 9.5+
FROM (
VALUES
('{{1,2,3}}'::int[]) -- 2-dim array
,('{{4,5,6}}')
,('{{7,8,9}}')
) t(arr2);
すべて 結果の列は同じタイプです :int[]
(異なる数の次元が含まれている場合でも)