Postgresql JSon 行到键值

Postgresql JSon rows to key-value

目前我有以下 postgresql json 数组对象形式的对象

[
  {
    "id": 1,
    "name": "dollar",
    "sign": "$",
    "exchange_rate": 1
  },
  {
    "id": 2,
    "name": "Riel",
    "sign": "៛",
    "exchange_rate": 4085
  },
  {
    "id": 3,
    "name": "Baht",
    "sign": "b",
    "exchange_rate": 30.55
  },
  {
    "id": 4,
    "name": "Dong",
    "sign": "d",
    "exchange_rate": 16000
  }
]

数组对象是以下查询的结果:

select json_agg(row_to_json(record))
from (
select
    c.id,
    c.name,
    c.sign,
    c.exchange_rate
from  currency c) record;

但上面的结果与我的需求略有不同。我想将该数组切换为另一种形式的键值对象,如下所示,这样我就可以通过 id 值遍历 json。

{
      "1": {
        "name": "dollar",
        "sign": "$",
        "exchange_rate": 1
      },
      "2": {
        "name": "Riel",
        "sign": "៛",
        "exchange_rate": 4085
      },
      "3": {
        "name": "Baht",
        "sign": "b",
        "exchange_rate": 30.55
      },
      "4": {
        "name": "Dong",
        "sign": "d",
        "exchange_rate": 16000
      }
    }

任何人都可以为我提供一些帮助来解决这个问题。尊重您的所有回答。

JSON_BUILD_OBJECT()JSON_OBJECT_AGG() 一起使用

SELECT JSON_OBJECT_AGG(id,
                       JSON_BUILD_OBJECT('name',name,
                                         'sign',sign,
                                         'exchange_rate',exchange_rate))
  FROM currency

保持原有功能考虑简单使用

SELECT JSON_OBJECT_AGG(id, ROW_TO_JSON(c)::JSONB - 'id' )
  FROM currency AS c

Demo

P.S: JSONB_PRETTY() 可能会添加,如演示中所述,将应用的最外层函数包装起来,为了显示结果格式化好。