カスタム集計関数の使用array_agg_mult()
この関連する回答で定義されているように:
期待する結果は不可能です:
{{1},NULL,{abc}}
次のようにする必要があります:
{{1},{NULL},{abc}}
配列要素が0または1の単純なケース
空の配列を置き換える単純なケースの場合:これは次の方法で実現できます:
WITH t(arr) AS (
VALUES
('{1}'::text[])
,('{}')
,('{abc}')
)
SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
FROM t;
n個の要素の動的パディング
array_fill()
の使用 最大長までNULL要素で配列を埋めるには:
SELECT array_agg_mult(ARRAY[
arr || array_fill(NULL::text
, ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
]) AS result
FROM t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
それでも1次元でのみ機能します 基本的な配列。
説明
- サブクエリ
t1
基本的な1次元配列の最大長を計算します。 -
COALESCE(array_length(arr, 1), 0)
この行の配列の長さを計算します。COALESCE
デフォルトは0
NULL
の場合 。 -
array_fill()
を使用して、長さの違いに対応するパディング配列を生成します 。 - それを
arr
に追加します||
を使用 - 上記のように
array_agg_mult()
で集計します 。
SQLフィドル。
すべてのデモンストレーション 。
SQL Fiddleでの出力は誤解を招くため、結果をテキストにキャストしました。