【问题标题】:Querying JSONB column in nested structure查询嵌套结构中的 JSONB 列
【发布时间】:2022-01-13 20:48:42
【问题描述】:

我以前从未使用过 JSONB 列,所以我正在为一个简单的查询而苦苦挣扎。

我需要从下面的这个 json 中选择所有 value 字段。输出应该是:value1, value2, value3, value4, value5, value6, value7, value8

这就是我所能得到的,但我找不到更深入 json 的方法。

SELECT result -> 'report' ->> 'products' AS values FROM example_table

感谢您的帮助。

CREATE TABLE example_table(
 id SERIAL PRIMARY KEY,
 result JSONB NOT NULL);

INSERT INTO example_table(result)
VALUES('{
  "report": {
    "products": [
      {
        "productName": "Product One",
        "types": [
          {
            "type": "Type One",
            "metadata": {
              "prices": [
                {
                  "price": {
                    "value": "value1"
                  }
                },
                {
                  "price": {
                    "value": "value2"
                  }
                }
              ]
            }
          },
          {
            "type": "Type Two",
            "metadata": {
              "prices": [
                {
                  "price": {
                    "value": "value3"
                  }
                },
                {
                  "price": {
                    "value": "value4"
                  }
                }
              ]
            }
          }
        ]
      },
      {
        "productName": "Product Two",
        "types": [
          {
            "type": "Type One",
            "metadata": {
              "prices": [
                {
                  "price": {
                    "value": "value5"
                  }
                },
                {
                  "price": {
                    "value": "value6"
                  }
                }
              ]
            }
          },
          {
            "type": "Type Two",
            "metadata": {
              "prices": [
                {
                  "price": {
                    "value": "value7"
                  }
                },
                {
                  "price": {
                    "value": "value8"
                  }
                }
              ]
            }
          }
        ]
      }
    ]
  }
}');

【问题讨论】:

  • 使用jsonb_array_elements(和->而不是->>),或者试试json路径
  • 嗨@Bergi,感谢您的提示。你能给我看一下代码示例吗?提前致谢

标签: postgresql jsonb


【解决方案1】:

您应该使用CROSS JOINjsonb_array_elements 函数来提取每个记录元素的数组

Demo

select
  et.id,
  string_agg(ptmp.value -> 'price' ->> 'value', ',')
from 
  example_table et
  cross join jsonb_array_elements(et.result -> 'report' -> 'products') p
  cross join jsonb_array_elements (p.value -> 'types') pt
  cross join jsonb_array_elements (pt.value -> 'metadata' -> 'prices') ptmp
group by et.id

【讨论】:

    猜你喜欢
    • 2017-01-28
    • 2023-04-07
    • 1970-01-01
    • 2021-02-18
    • 2017-02-23
    • 1970-01-01
    • 2023-04-03
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多