【问题标题】:Building a jsonb object without using subquery in postgresql 12在 postgresql 12 中不使用子查询构建 jsonb 对象
【发布时间】:2021-02-04 22:11:52
【问题描述】:

我有一个名为 users 的表,其中有一个名为“history”的 jsonb 列。这是一个对象数组,其中一个元素称为 uid,它是访问页面的人的 id,如下所示:

[ {"ip":"...","uid":2} , {"ip":"...","uid":4} , ... ]

我正在运行一个查询,该查询将 jsonb 对象附加到字段 uname 以便更容易理解谁会产生“uid”:

[ {"ip":"...","uid":2,"uname":"bob"} , {"ip":"...","uid":4,"uname":"dave"} , ... ]

我目前正在使用以下查询(例如,其中 uid=2)执行此操作:

SELECT json_agg(history2||jsonb_build_object('uname',uname::text)) FROM 
  (SELECT jsonb_array_elements(history) AS history2 FROM users WHERE uid=2) AS table1 
  LEFT JOIN users AS table2 ON history2->>'uid'=table2.uid

我正在使用子查询返回一个 json 对象表,然后再次加入用户表以获取用户名。

我的问题是:有没有办法在没有子查询的情况下做到这一点?我读过可以使用横向连接,但我在这方面的所有尝试似乎都不起作用。

提前致谢。

【问题讨论】:

  • 子查询有什么问题(实际上是一个派生表)。如果您需要更改数组的每个元素,那么您唯一的选择就是取消嵌套数组,更改每个元素并聚合回来 - 这正是您正在做的事情。这再次说明了为什么 JSON 并不总是一个好主意。在一个适当规范化的模型中,这不是必要的开始
  • 感谢您的评论,我同意子查询没有问题。这更多是为了我个人在 postgres 中学习 JSON 处理而不是特定应用程序。

标签: postgresql


【解决方案1】:

您可以使用外连接将jsonb_array_elements 移动到 FROM 子句中:

SELECT jsonb_agg(h.item||jsonb_build_object('uname', u.uname)) 
FROM users u
  LEFT JOIN jsonb_array_elements(u.history) as h(item) on h.item ->> 'uid' = u.uid::text
WHERE u.uid = 2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2017-06-27
    • 2015-04-13
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多