【问题标题】:How to perfom adequate operations on JSONB PostgresSQL如何在 JSONB PostgresQL 上执行足够的操作
【发布时间】:2022-01-09 16:03:20
【问题描述】:

假设我有

sequelize.query('SELECT associations FROM users WHERE id = :id')

associations 是一个 JSONB ARRAY 列

输出看起来像这样

[
        {
            "role": 2,
            "shop_id": 1,
            "admin_id": 1,
            "manager_id": null
        }
    ]

我想遍历数组并使用这些 id 搜索这些关联

我想在同一个查询中执行整个操作。

我有一个role table, shop table, users table

进展 所有列都显示为空

【问题讨论】:

    标签: postgresql sequelize.js


    【解决方案1】:

    如果 associationjsonb[] 类型的列,则使用 unnest(association) 以扩展第一级元素。

    然后你可以尝试这样的事情,假设所有id 都是整数类型:

    sequelize.query('
     SELECT *
       FROM users
      CROSS JOIN LATERAL unnest(associations) AS j
       LEFT JOIN role AS r
         ON (j->>\'role\') :: integer = r.id
       LEFT JOIN shop AS s
         ON (j->>\'shop_id\') :: integer = s.id
       LEFT JOIN users AS a
         ON (j->>\'admin_id\') :: integer = a.id
       LEFT JOIN users AS m
         ON (j->>\'manager_id\') :: integer = m.id
      WHERE id = :id'
    )
    

    【讨论】:

    • 为 JSON 属性名称添加单引号,即j->>'role'。最好使用ON (j->>'role')::integer = r.id 然后ON j->>'role' = r.id::text,以免破坏role(id) 上的索引(可能是主键)。
    • @Stefanov.sm 好的,谢谢
    • 我收到了这个错误function jsonb_array_elements(jsonb[]) does not exist,我猜这与我定义列associations: { allowNull: true, type: DataTypes.ARRAY(DataTypes.JSONB), defaultValue: [] }的方式有关
    • jsonb_array_elements 函数适用于jsonb 数据类型,而您的列关联属于jsonb[] 类型。因此,在您的情况下,只需将jsonb_array_elements() 替换为unnest(),并相应更新答案。
    猜你喜欢
    • 2010-12-07
    • 2022-01-26
    • 2016-08-26
    • 2014-09-24
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多