Postgresql

當所有值都具有相同的類似 json 的結構時,如何在 JSONB 列中查詢?

  • September 8, 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 語句來返回上面的行,將 b2 (1231342138adc2fehj3j21321321321kjk1423j32k9) 的值作為輸入參數。

就像是:

SELECT * 
FROM table 
WHERE [Column2 contains b which contains b2 which has value '1231342138adc2fehj3j21321321321kjk1423j32k9'] ; 

要不就:

SELECT * 
FROM table 
WHERE [value '1231342138adc2fehj3j21321321321kjk1423j32k9' exists in row from Column2 ]

我只是不知道如何給出這個指令。

任何幫助是極大的讚賞。

您可以jsonb_path_exists與 JSON 路徑查詢一起使用

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

db<>小提琴

[*]此路徑中的意思是“任何數組元素”,並且? (@ == ...)表示該路徑上的值必須等於您的值的謂詞。

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