sql - PostgreSQL 可以在 jsonb 数组对象上加入吗?

标签 sql arrays json postgresql lateral-join

我正在考虑切换到 PostgreSQL,因为它支持 JSON。但是,我想知道,是否可以通过单个查询执行以下操作:

假设有两个表:

表 1) 组织:

  ID (INT)  |  members (JSONB)                                        |
------------+---------------------------------------------------------|
     1      | [{ id: 23, role: "admin" }, { id: 24, role: "default" }]|
     2      | [{ id: 23, role: "user" }]

表 2)用户:

  ID (INT)  | name TEXT | email TEXT    |
------------+-----------+---------------|
     23     | Max       | max@gmail.com |
     24     | Joe       | joe@gmail.com |

现在我想得到这样的结果(我只有组织的 ID [1]):

  ID (INT)  |  members (JSONB)                                       |
------------+--------------------------------------------------------|
     1      | [{ id: 23, name: "Max", email: "max@gmail.com", role: 
                "admin" },
               { id: 24, name: "Joe", email: "joe@gmail.com ", role: 
                "default" }]
(1 row)

我知道这不是 JSONB 的目的,并且有更好的解决方案可以将这些数据存储在 SQL 中,但我只是好奇这是否可行。

谢谢!

最佳答案

是的,使用 Postgres 可以满足这个要求。这是 9.6 或更高版本的解决方案。

SELECT o.id, JSON_AGG(
    JSON_BUILD_OBJECT(
        'id'    , u.id, 
        'name'  , u.name, 
        'email' , u.email, 
        'role'  , e.usr->'role'
    )
)
FROM organisations o
CROSS JOIN LATERAL JSONB_ARRAY_ELEMENTS(o.data) AS e(usr)
INNER JOIN users u ON (e.usr->'id')::text::int = u.id
GROUP BY o.id

参见 this db fiddle .

解释:

  • JSONB_ARRAY_ELEMENTS 函数将组织 json 数组拆分为多行(每个用户一个);它通常与JOIN LATERAL

    结合使用
  • 为了加入 users 表,我们使用 -> 运算符访问 id 字段的内容

  • 对于每个用户,JSONB_BUILD_OBJECT 用于通过传递值/键对列表来创建新对象;大多数值来自 users 表,role 除外,它取自组织 json 元素

  • 查询按组织 id 聚合,使用 JSONB_AGG 组合上述对象生成 json 数组

更多信息,您也可以查看Postgres JSON Functions documentation .

关于sql - PostgreSQL 可以在 jsonb 数组对象上加入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54336687/

相关文章:

mysql - SQL查询-如何仅显示最常见的值

sql查询删除

mysql - 月数的嵌套 SQL 查询

javascript - 获取数据 javascript 并推送到数组 Cordova

javascript - Array.find() 获得正确的值但返回错误的值

mysql Event每年运行一次计算

javascript - 需要使用 JavaScript 将 JSON 格式转换为另一种 json 格式

ruby-on-rails - 在 Rails 中覆盖 MIME 类型

c# - 将 .NET Dictionary<string, string> 序列化为 JSON 键值对对象

javascript - Objective-c [For 循环] 在 UIWebview 中加载 HTML 并从 JavaScript 函数检索数据