簡體   English   中英

PostgreSQL 對 JSONB 對象數組的查詢

[英]PostgreSQL query on a JSONB Array of Objects

我有一個具有這種復雜結構的 PostgreSQL 表:

"item": [{
        "field10",
        "field11",
        "field12": {
            "field20"
        },
        "field13": [{
                "field21": [{
                        "field30"
                    }
                ],
                "field22": [{
                        "field31"
                        "field32": {
                            "field40"
                        }
                    }
                ],
            }
        ]
    }]

而且我必須對過濾器進行查詢,直到field40比我看到的對象更簡單的許多解釋。 你能解釋一下我該怎么做嗎?

編輯:

我做的例子比現實更簡單。 實際上,object 非常長。 如果我嘗試用值做一個簡單的例子,那就是這樣:

{
"uuid": "64fc7a55-be2d-41d8-99c1-d08fa5780731",
"item": [{
            "field10" : 2004,
            "field11" : false,
            "field12": {
                "field20" : "cc092aa1-6465-4526-9292-373344ed3e18",
                "field21" : "AMAZONE"
            },
            "field13": [{
                    "field22": [{
                            "field30" : "ee5bfd21-b2ce-453e-94a2-ef9c87002758",
                            "field31" : "MICROSOFTE"
                        },{
                            "field30" : "2eb39939-08b9-4456-9b5b-eff88f00bacb",
                            "field31" : "GOOGLEE"
                        }
                    ],
                    "field23": [{
                            "field32" : "e70bec99-689a-4c5d-ab81-e7601bc5b435",
                            "field33": {
                                "field40" : "a70ce09e-21ec-46cd-bfe6-591b84c0b328",
                                "field41" : "https://stackoverflow.com/"
                            }
                        },{
                            "field32" : "e70bec99-689a-4c5d-ab81-e7601bc5b435",
                            "field33": {
                                "field40" : "7bfa6882-2e65-4f96-b4a5-6aa0d148a95d",
                                "field41" : "https://gis.stackexchange.com/"
                            }
                        }
                    ],
                }
            ]
        }]
},
{
"uuid": "f131864a-338e-4f2c-91b1-13950958bd62",
"item": [{
            "field10" : 2012,
            "field11" : false,
            "field12": {
                "field20" : "2b8176e4-c858-4159-b279-d852df77c63b",
                "field21" : "PIXABAYE"
            },
            "field13": [{
                    "field22": [{
                            "field30" : "9e70b3d8-8f3f-4ae1-ba64-86efa513bd28",
                            "field31" : "IOBEYAE"
                        },{
                            "field30" : "0150dba2-98de-4143-bd81-329b74874403",
                            "field31" : "PINTERESTE"
                        }
                    ],
                    "field23": [{
                            "field32" : "3ab19111-513a-47db-9fb5-52dc0a1e1c4d",
                            "field33": {
                                "field40" : "7be95726-6698-4bdd-8f6b-2595d1704a2a",
                                "field41" : "https://google.com/"
                            }
                        },{
                            "field32" : "7993aba5-f13f-4998-af7b-9b0b8aec8aa9",
                            "field33": {
                                "field40" : "4740dbcf-84c4-40ff-a633-9207e79cabf4",
                                "field41" : "https://yahoo.com/"
                            }
                        }
                    ],
                }
            ]
        }]
}

在這個例子中,我的 Postgres 表有兩列,一列帶有主鍵uuid ,另一列帶有 jsonb中的 object 而我想要的,例如,對我的項目進行過濾,其中“field41”包含值“gis.stackexchange在這個例子中,如果我搜索 "field41" = "https://yahoo.com/" 的 .com" 元組 "uuid" = "uuid": "64fc7a55-be2d-41d8-99c1-d08fa5780731" 將不會結果中

使用 PostgreSQL v12 及更高版本,您可以使用 jsonpath 語言編寫這樣的查詢:

SELECT uuid
FROM jtab
WHERE jsonb_path_exists(
         item,
         '$[*].field13[*].field23[*].field33.field41 ? (@ == "https://yahoo.com/")'
      );

您的問題表明您還需要在"field41"的 URL 上完成部分匹配。 這可以通過使用jsonb_array_elements枚舉每個嵌套數組,然后使用WHERE... LIKE...過濾與所需域名匹配的記錄來完成:

SELECT
   t.data->>'uuid' as uuid,
   jfield23->'field33'->>'field40' as field40,
   jfield23->'field33'->>'field41' as field41
FROM
   jtest t,
   jsonb_array_elements(t.data->'item') as jitem,
   jsonb_array_elements(jitem->'field13') as jfield13,
   jsonb_array_elements(jfield13->'field23') as jfield23
WHERE jfield23->'field33'->>'field41' LIKE '%' || 'yahoo.com' || '%'

為了便於說明,我在SELECT子句中包含了相關的field40field41

請參閱db<>fiddle上的完整示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM