Postgresql

如何在postgresql的JSONB類型列中的json結構中選擇特定級別的所有嵌套值?

  • September 9, 2022

在 postgresql 數據庫中,我有一個包含 2 列的表:

Column1 是 VARCHAR 類型,包含多行 id,格式如下:ID1123312

Column2 是 JSONB 類型,包含多行具有以下結構的 json:

{
   "a": [
       {
           "a1": "2022-01-01",
           "a2": "2026-01-31",
           "a3": 1
       }
   ],
   "b": [
       {
           "b1": "J",
           "b2": "1231342138adc2fehj3j21321321321kjk1423j32k9"
       }
   ],
   "c": [
       {
           "c1-1": "2021-02-01",
           "c1-2": "2021-01-01"
       },
       {
           "c2-1": "2021-04-01",
           "c2-2": "2021-03-01"
       }
   ]
}

我需要建構一個 SELECT 語句以僅從Column2 的所有行返回 b2 屬性的值。如果它只有一行,那麼只有'1231342138adc2fehj3j21321321321kjk1423j32k9’。如果它有多行,則它在每行內的每個 jsonb 中找到的任何值。

任何幫助是極大的讚賞。

我試過了:

SELECT *
FROM t
WHERE jsonb_path_exists(t.jsonColumn, '$.b[*].b2 ? (@ == "1231342138adc2fehj3j21321321321kjk1423j32k9")')

SELECT * 返回表的整行,但我不知道如何指示它只返回 b2 屬性包含的任何值(嵌套在行中的 json 內)。

b似乎每個數組中只有一個對象。因此,您實際上不需要路徑查詢,您可以使用普通的 JSON 訪問器。

->檢索值作為json(b)並將->>其檢索為文本

SELECT t.jsonColumn->'b'->0->>'b2'
FROM t
WHERE t.jsonColumn->'b'->0->>'b2' IN ('Value1', 'Value2');

db<>小提琴

引用自:https://dba.stackexchange.com/questions/316680