PostgreSql jsonb字段查看

PostgreSql jsonb field to view

我在我的 table“进程”中名为“FORM”的列之一中有这种 jsonb 数据,我想用一些数据创建视图,这些数据位于我只想要的名为字段的行内name 和 value form field named array in this jsonb.

这里是 jsonb:

 {
      "column": [
        {
          "row": {
            "id": "ebc7afddad474aee8f82930b6dc328fe",
            "name": "Details",
            "field": [
              {
                "name": {
                  "id": "50a5613e97e04cb5b8d32afa8a9975d1",
                  "label": "name"
                },
                "value": {
                  "stringValue": "yhfghg"
                }
              }
            ]
          }
        },
        {
          "row": {
            "id": "5b7471413cbc44c1a39895020bf2ec58",
            "name": "leave details",
            "field": [
              {
                "name": {
                  "id": "bb127e8284c84692aa217539c4312394",
                  "label": "date"
                },
                "value": {
                  "dateValue": 1549065600
                }
              },
              {
                "name": {
                  "id": "33b2c5d1a968481d9d5e386db487de52",
                  "label": "days",
                  "options": {
                    "allowedValues": [
                      {
                        "item": "1"
                      },
                      {
                        "item": "2"
                      },
                      {
                        "item": "3"
                      },
                      {
                        "item": "4"
                      },
                      {
                        "item": "5"
                      }
                    ]
                  },
                  "defaultValue": {
                    "radioButtonValue": "1"
                  }
                },
                "value": {
                  "radioButtonValue": "3"
                }
              }
            ]
          }
        }
      ]
    }

我想要这种 jsonb 视图数据来自名为 row 的对象内名为 field 的子数组......

[
  {
    "name": {
      "id": "50a5613e97e04cb5b8d32afa8a9975d1"
    },
    "value": {
      "stringValue": "yhfghg"
    }
  },
  {
    "name": {
      "id": "bb127e8284c84692aa217539c4312394"
    },
    "value": {
      "dateValue": 1549065600
    }
  },
  {
    "name": {
      "id": "33b2c5d1a968481d9d5e386db487de52"
    },
    "value": {
      "radioButtonValue": "3"
    }
  }
]

我该怎么做?

我用了两次jsonb_array_elements展开两个数组,然后用json_build_object制作结果结构,jsonb_agg将上面生成的几行组合成一个JSONB数组。

我在结果中包含了一个行号,这样我以后可以应用 group by,这样 "process" 行的结果就不会被 jsonb_agg.[=16 意外组合=]

with cols  as (select jsonb_array_elements( "FORM" ->'column') as r
                     ,row_number() over () as n from  "process" )
    ,cols2 as (select jsonb_array_elements(r->'row'->'field') as v
                     ,n from cols)
select jsonb_agg(json_build_object('name',v->'id','value',v->'value'))
from cols2 group by n;