簡體   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