【问题标题】:Concatenate Postgresql jsonb column with row data将 Postgresql jsonb 列与行数据连接起来
【发布时间】:2020-10-08 02:56:59
【问题描述】:

我有一个带有 id 列的数据表和一个带有对象数据的 jsonb 列:

id (int) 数据(jsonb)

我是这样查询数据的

select row_to_json(t)
from (
    select id, data from accounts
) t;

这让我得到如下所示的数据:

{
   "id":3,
   "data":
   {
      "emailAddress": "someone@gmail.com", 
      "mobileNumbers": ["5559991212"]
   }
}

我想将数据字段合并到主记录集中,我基本上希望数据节点中的键进入主记录:

{
   "id":3,
   "emailAddress": "someone@gmail.com", 
   "mobileNumbers": ["5559991212"]
}

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    你可以使用

    SELECT jsonb_set(data, '{id}', to_jsonb(id))
    FROM accounts;
    

    我不得不指出,只有一个主键和一个 jsomb 列的表对我来说似乎是一个有问题的数据库设计。

    【讨论】:

    • 感谢您的反馈,我通过省略其他列显着简化了表格设计。我正在采用一种将对象存储在 jsonb 中的方法,但将数据非规范化为用于搜索和连接到其他对象表的列。
    • 啊,听起来更好。
    • 这是正确答案,我已将其标记为正确答案。我可以根据第一个问题寻求更多建议吗?
    • 我有两个与帐户表相关的表,它们是 1..n,我想获取该数据并将其嵌套在帐户表的数据中。遇到麻烦,我可以让其他数据数组相邻但不嵌套:SELECT jsonb_set(data, '{id}', to_jsonb(id)) account, ( SELECT array_to_json(array_agg(jsonb_set(data, '{id}', to_jsonb(id)))) FROM people WHERE account_id = accounts.id ) people FROM accounts;
    • 听起来像是第二个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 2014-12-05
    • 2020-04-02
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多