【问题标题】:Query an array element in an JSONB Object查询 JSONB 对象中的数组元素
【发布时间】:2026-01-06 22:10:01
【问题描述】:

我在名为reports 的表中有一个名为datajsonb 列。这是report.id = 1 的样子

[
    {
        "Product": [
            {
                "productIDs": [
                    "ABC1",
                    "ABC2"
                ],
                "groupID": "Food123"
            },
            {
                "productIDs": [
                    "EFG1"
                ],
                "groupID": "Electronic123"
            }
        ],
        "Package": [
            {
                "groupID": "Electronic123"
            }
        ],
        "type": "Produce"
    },
    {
        "Product": [
            {
                "productIDs": [
                    "ABC1",
                    "ABC2"
                ],
                "groupID": "Clothes123"
            }
        ],
        "Package": [
            {
                "groupID": "Food123"
            }
        ],
        "type": "Wearables"
    }

]

这是report.id = 2 的样子:

[
    {
        "Product": [
            {
                "productIDs": [
                    "XYZ1",
                    "XYZ2"
                ],
                "groupID": "Food123"
            }
        ],
        "Package": [],
        "type": "Wearable"
    },
    {
        "Product": [
            {
                "productIDs": [
                    "ABC1",
                    "ABC2"
                ],
                "groupID": "Clothes123"
            }
        ],
        "Package": [
            {
                "groupID": "Food123"
            }
        ],
        "type": "Wearables"
    }
]

我正在尝试获取reports 表中所有条目的列表,其中至少一个data 列的元素具有以下内容: type = Produce 和 其中Product 数组的任何元素或Product 数组的groupID 的任何元素都以Food 开头

所以从上面的例子来看,这个查询只会返回第一个索引

  1. 类型 = Produce
  2. groupID 以Food 开头,表示Product 数组的第一个元素

第二个索引将被过滤掉,因为类型不是Produce

我不确定如何查询以对 groupID 进行 AND 查询。这是我试图获取类型Produce的所有条目

 select * from reports r, jsonb_to_recordset(r.data) as items(type text) where items.type like 'Produce';

【问题讨论】:

    标签: sql json postgresql jsonb lateral


    【解决方案1】:

    示例结构和结果:dbfiddle

    select r.*
    from reports r
             cross join jsonb_array_elements(r.data) l1
             cross join jsonb_array_elements(l1.value -> 'Product') l2
    where l1 ->> 'type' = 'Produce'
    and l2.value ->> 'groupID' ~ '^Food';
    

    【讨论】: