0

我有一个jsonb名为data的表中的列reports。这是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= ProduceAND 其中数组的Product任何元素或Product数组的任何元素都groupIDFood

所以从上面的例子中这个查询将只返回第一个索引,因为

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

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

我不知道如何查询做 AND 查询groupID。这是我试图获取类型的所有条目Produce

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

1 回答 1

0

示例结构和结果: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';
于 2021-10-20T07:25:35.560 回答