【发布时间】: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