在SQL函数中,我有一个jsonb数组的格式如下:

[{id: 1, name: John}, {id: 2, name: Jane}]

我想把这个 struct 转换成一个jsonb,使用id作为键:

{
  1: {id: 1, name: John},
  2: {id: 2, name: Jane}
}

推荐答案

您可以使用jsonb_array_elements()分解数组,然后重新聚合为一个具有jsonb_object_agg()的对象.Demo at db<>fiddle:

select jsonb_object_agg(_element->>'id', _element)
from my_table
cross join lateral jsonb_array_elements(my_table.jdata) as _an(_element)
group by my_table.ctid
jsonb_object_agg
{"1": {"id": 1, "name": "John"}, "2": {"id": 2, "name": "Jane"}}
{"1": {"id": 1, "name": "John"}, "2": {"id": 2, "name": "Ted"}, "11": {"id": 11, "name": "Jane"}, "111": {"id": 111, "name": "Bob"}}

你不能使用JSON number作为密钥,这就是为什么我使用->>访问器转换为text.不知道你的主键,我按system column ctid分组,因为它总是存在和唯一的,但你可能想要你的实际PK.cross join lateral可以用单个逗号,替换,但显式join语法通常优于旧的隐式风格.

如果你不希望实际的id,而是希望数组中的索引作为新键,你可以使用with ordinality来获得这些:

select jsonb_object_agg(n::text, e)
from my_table 
   , jsonb_array_elements(jdata) with ordinality as elements(e,n)
group by my_table.ctid

update,而不是select:

update my_table set jdata=
(select jsonb_object_agg(e->>'id', e)
 from jsonb_array_elements(jdata) e )
returning jsonb_pretty(jdata);
jsonb_pretty
{
    "1": {
        "id": 1,
        "name": "John"
    },
    "2": {
        "id": 2,
        "name": "Jane"
    }
}
{
    "1": {
        "id": 1,
        "name": "John"
    },
    "2": {
        "id": 2,
        "name": "Ted"
    },
    "11": {
        "id": 11,
        "name": "Jane"
    },
    "111": {
        "id": 111,
        "name": "Bob"
    }
}

请注意,jsonb array始终保持其原始顺序为重要,但结果的jsonb object将由PostgreSQL根据键自由重新排序.

Sql相关问答推荐

查询将查找将标记设置为user2的用户

如何实现一个广泛的多级自连接PostgreSQL查询?

SQL—如何在搜索的元素之后和之前获取元素?

如何连接第二个表并将其内容输入到第一个表的单个字段中?

在postgres中动态计算出现次数并插入到json中

在Golang中管理数据库事务的简洁方法

如何在SQL中按每个子组的顺序更新数据?

我怎样才能得到列值对应的最大值在另一个?

按分类标准检索记录

如何使用SQL Server中的Nodes()方法执行与OPENXML相同的操作

基于变量的条件 WHERE 子句

获取所有用户的第一次和最后一次发货以及到达日期

SQL 按 id 运行总计并受条件限制(在窗口上)

如何 Select 一列具有最小值而另一列具有给定值的记录?

计算 PostgreSQL 中的平均会话长度

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

条件意外地显着降低性能的地方

来自 SQL Server 的树层次 struct 图的 JSON

如何优化sql请求?