繁体   English   中英

查询 JSONB 对象中的数组元素

[英]Query an array element in an JSONB Object

我在名为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 AND 其中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';

示例结构和结果: 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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM