Postgresの複数の列をjsonに


23

私はpostgresql 9.3.4を実行しています。3つのフィールドを持つテーブルがあります。

id   name  addr
---  ----  ----
1    n1    ad1
2    n2    ad2
...

次のようなフィールドを持つ新しいテーブルにデータを移動する必要があります。

id   data
---  ----
1    {'name': 'n1', 'addr': 'ad1'}
2    {'name': 'n2', 'addr': 'ad2'}
...

row_to_json結果にSELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) t追加idされるので、私にとっては解決策ではありません。データフィールドで必要なフィールド(名前とアドレス)を選択する方法はありますか?


答えが正しいかどうかはわかりません。2年前に聞いた。私もその質問に答えましたが、正しいとマークしませんでした。
AliBZ

回答:


51

json_build_object()Postgres 9.4+にはより良いオプションがあります:

SELECT id, json_build_object('name', name, 'addr', addr) AS data
FROM   myt;

しかしrow_to_json()、Postgres 9.3にはより簡単で高速な方法もあります。

SELECT id, row_to_json((SELECT d FROM (SELECT name, addr) d)) AS data
FROM   myt;

db <> fiddle here Postgres 9.6 での
古いSQL Fiddle

関連する回答:


これは良い答えである、とフィドルは証拠を持っています。
MIguelele

5

私からの答えを見つけたこのリンク

select * from (
  select id,
    (
      select row_to_json(d)
      from (
        select name, addr
        from myt d
        where d.id=s.id
      ) d
    ) as data
  from myt s
)

自分の答えを正しいものとしてマークすることを忘れないでください(ポイントはありません:-()。これをすぐにできるとは思いませんが、将来同様の質問をする人を助けるかもしれません。
15

2
外部クエリにテーブルエイリアスがないことに加えて、これは必要以上に複雑で高価です。デモンストレーションするために、フィドルで別の答えを追加しました。
アーウィンブランドステッター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.