PostgreSQL:根据嵌套在对象数组中的另一个对象内的对象中是否存在动态字段来查询表

时间:2018-04-11 16:10:15

标签: json postgresql psql jsonb

在表items中,我有一个名为users的jsonb列。 users的JSON结构遵循以下示例:

[
    {
        "required": 1,
        "agents": {
            "user1": "A",
            "user2": "P",
            "user3": "A"
        }
    },
    {
        "required": 3,
        "agents": {
            "user1": "P",
            "user4": "P",
            "user5": "P"
        }
    }
]

请注意,表items包含许多字段,但为了简单起见,我们可以认为它只有item_idusers字段。我在SO上看到的所有答案都提供了对数组内直接对象元素的查询。

我也希望能以更好的方式重写对象的结构,但在这种情况下,我不是我的决定:D。

我刚接触到postgres中的JSON查询,所以我尝试写一些查询但没有成功。

问题: 我正在尝试查找一个查询,该查询可以返回所有具有密钥“user4”的所有items。在数组中任何元素的代理子对象内。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用函数jsonb_array_elements()?运算符:

select i.*
from items i
cross join jsonb_array_elements(users)
where value->'agents' ? 'user4' 

请参阅JSON Functions and Operators.