1

次の CTE を想定します。

with mytable as (
    select column1 as foo, column2 as bar, column3 as baz
    from (values
      ('a', 'b', 1),
      ('c', 'd', 2)
    ) v
)

を使用array_agg()すると、値の配列が出力されます。

select
    array_agg(v)
from mytable v;

-- {"(a,b,1)","(c,d,2)"}

しかし驚くべきことに (少なくとも私には)、to_json()この配列を使用すると、フィールド名が各行のオブジェクトに復元されます

select
    to_json(array_agg(v))
from mytable v;

-- [{"foo":"a","bar":"b","baz":1},{"foo":"c","bar":"d","baz":2}]

各行を値の配列としてレンダリングする代わりに、PostgreSQL に配列の配列を出力させるにはどうすればよいでしょうか?

select
    something(v)
from mytable v;

-- [["a", "b", 1],["c", "d", 2]]
4

2 に答える 2

2

行を json に変換し、キーと値のペアをネスト解除してから、値を集約して戻すことができます。

with mytable (foo, bar, baz) as (
  values
    ('a', 'b', 1),
    ('c', 'd', 2)
)
select jsonb_agg(x.vals)
from mytable m
  cross join lateral (
    select jsonb_agg(value order by idx) as vals
    from json_each(row_to_json(m)) with ordinality as t(key,value,idx)
  ) x

json配列内の列値の順序が重要な場合は、行を変換するために使用することが重要です。

これが頻繁に必要な場合は、これを関数に入れることができます。


配列内の列値の順序が重要でない場合は、JSON パス関数を使用できます。

select jsonb_path_query_array(to_jsonb(m), '$.keyvalue().value')
from mytable m;
于 2021-04-28T18:07:15.943 に答える