【问题标题】:Postgresql get keys from nested array of objects in JSONB fieldPostgresql 从 JSONB 字段中的嵌套对象数组中获取键
【发布时间】:2019-09-26 07:37:12
【问题描述】:

这里是 jsonb 列的虚拟数据

{
"address": [
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url1"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
},
{
  "country": "US",
  "extension": [
    {
      "extension": [
        {
          "valueDecimal": -71.024638,
          "url": "latitude"
        },
        {
          "url": "longitude",
          "valueDecimal": 42.082543
        }
      ],
      "url": "url2"
    }
  ],
  "postalCode": "02301",
  "city": "Brockton"
}
]
}

我想得到类似address->'extension'->'extension'->'valueDecimal' 的东西,但它只适用于 json,但它是 JSON 数据数组...我的预期输出 -

[-71.024638, -71.024638]

我能够通过以下查询获得第一个扩展名(即 JSON 的第一个数组)

SELECT elems.value  FROM "patient", jsonb_array_elements(resource -> 'extension') AS elems;

所以问题是我无法获取内部“扩展”(它在扩展对象内部)数据。任何帮助都会有所帮助。

【问题讨论】:

    标签: postgresql jsonb postgresql-json


    【解决方案1】:

    您可以交叉加入多个级别的jsonb_array_elements

    SELECT json_agg(elems3->>'valueDecimal') as latitudes
        FROM patient
     cross join jsonb_array_elements(resource ->'address'  ) AS elems
     cross join jsonb_array_elements(elems ->'extension')  AS elems2
     cross join jsonb_array_elements(elems2 ->'extension') AS elems3
     where elems3->>'url' = 'latitude'
    

    DEMO

    尽管有一些方法可以提高性能,但对于大型记录,这可能会更慢。推荐的选项是重新设计和规范化您的表,将值作为列单独存储在其对应表中,并仅在没有其他方法处理数据的情况下使用 JSON

    【讨论】:

    • 有没有办法索引这个嵌套数据?
    • @Jitendra :是的,正如我所说,有一些选项,例如使用GIN 索引。您可以探索它们。
    • 是的,我试过了,它适用于嵌套的 json 对象,但不适用于 json 对象的多级数组。像这样的东西 - CREATE INDEX idxginp ON patient USING gin ((resource->'maritalStatus'->'coding') jsonb_path_ops);
    猜你喜欢
    • 2019-09-24
    • 2017-06-27
    • 1970-01-01
    • 2021-11-29
    • 2015-04-13
    • 1970-01-01
    • 2019-02-17
    • 2022-07-02
    • 1970-01-01
    相关资源
    最近更新 更多