0

我有一个带有 jsonb 列的表,它返回以下对象。

[
  {
    "ele_llist": [
      726,
      144,
      976,
      144,
      976,
      225,
      726,
      225
    ],
    "sgtc": 1,
    "text_detail_list": {
      "alt_ele_list": [
        [
          726,
          203,
          833,
          203,
          833,
          224,
          726,
          223
        ],
        [
          786,
          144,
          917,
          144,
          917,
          182,
          786,
          182
        ],
        [
          835,
          210,
          972,
          211,
          972,
          225,
          835,
          224
        ],
        [
          842,
          182,
          976,
          182,
          976,
          205,
          842,
          205
        ]
      ],
      "sfc": [
        0,
        0,
        0,
        0
      ],
      "sgtc": [
        1,
        1,
        1,
        1
      ],
      "pname": [
        "GOLDEN oy",
        "gallne",
        "OSETTY EESTAUEA",
        "AIsoR"
      ],
      "poidc": [
        0.9,
        0.9,
        0.9,
        0.9
      ]
    },
    "sfc": 0,
    "did": "hC5qbBF2IO0.2018-11-13_17-14-19.0",
    "poidc": 0.9,
    "pname": "GOLDEN oy gallne OSETTY EESTAUEA AIsoR"
  },
  {
    "ele_llist": [
      543,
      26,
      697,
      26,
      697,
      57,
      543,
      57
    ],
    "sgtc": 1,
    "text_detail_list": {
      "alt_ele_list": [
        [
          543,
          34,
          696,
          26,
          697,
          49,
          544,
          57
        ]
      ],
      "sfc": [
        0
      ],
      "sgtc": [
        1
      ],
      "pname": [
        "mloachomgrprgren"
      ],
      "poidc": [
        0.45
      ]
    },
    "sfc": 0,
    "did": "hC5qbBF2IO0.2018-11-13_17-14-19.0",
    "poidc": 0.45,
    "pname": "mloachomgrprgren"
  },
  {
    "ele_llist": [
      1037,
      96,
      1127,
      96,
      1127,
      128,
      1037,
      128
    ],
    "sgtc": 1,
    "text_detail_list": {
      "alt_ele_list": [
        [
          1037,
          96,
          1127,
          96,
          1127,
          128,
          1037,
          128
        ]
      ],
      "sfc": [
        0
      ],
      "sgtc": [
        1
      ],
      "pname": [
        "LD"
      ],
      "poidc": [
        0.45
      ]
    },
    "sfc": 0,
    "did": "hC5qbBF2IO0.2018-11-13_17-14-19.1",
    "poidc": 0.45,
    "pname": "LD"
  },
  {
    "ele_llist": [
      538,
      25,
      699,
      25,
      699,
      58,
      538,
      58
    ],
    "sgtc": 1,
    "text_detail_list": {
      "alt_ele_list": [
        [
          538,
          34,
          698,
          25,
          699,
          49,
          539,
          58
        ]
      ],
      "sfc": [
        0
      ],
      "sgtc": [
        1
      ],
      "pname": [
        "a@lokomgrergimi"
      ],
      "poidc": [
        0.45
      ]
    },
    "sfc": 0,
    "did": "hC5qbBF2IO0.2018-11-13_17-14-19.1",
    "poidc": 0.45,
    "pname": "a@lokomgrergimi"
  },
  {
    "ele_llist": [
      729,
      145,
      993,
      145,
      993,
      229,
      729,
      229
    ],
    "sgtc": 1,
    "text_detail_list": {
      "alt_ele_list": [
        [
          729,
          202,
          993,
          209,
          993,
          229,
          729,
          223
        ],
        [
          843,
          183,
          980,
          184,
          980,
          207,
          843,
          206
        ],
        [
          792,
          146,
          918,
          145,
          918,
          178,
          792,
          179
        ]
      ],
      "sfc": [
        0,
        0,
        0
      ],
      "sgtc": [
        1,
        1,
        1
      ],
      "pname": [
        "GOLDON ory OSETTY ESTAUEANT",
        "AIENISORSSA",
        "gal"
      ],
      "poidc": [
        0.9,
        0.9,
        0.9
      ]
    },
    "sfc": 0,
    "did": "hC5qbBF2IO0.2018-11-13_17-14-19.1",
    "poidc": 0.9,
    "pname": "GOLDON ory OSETTY ESTAUEANT AIENISORSSA gal"
  }
]

我想访问内部text_detail_list我可以使用以下查询访问它

select obj->'text_detail_list'->'pname'->0 as "pname" from 
ele_tbl, json_array_elements(ele_json) obj

在这里,我需要以数字形式提供 0、1、2..。有没有其他方法可以在不使用数字计数器的情况下获取子元素?

4

1 回答 1

0

是的,您可以jsonb_array_elements_text在提取的 jsonb 数组上再次申请。

select jsonb_array_elements_text(obj->'text_detail_list'->'pname') 
  as pname
  from ele_tbl cross join lateral
jsonb_array_elements(ele_json) obj

输出

 pname                       |
 :-------------------------- |
 GOLDEN oy                   |
 gallne                      |
 OSETTY EESTAUEA             |
 AIsoR                       |
 mloachomgrprgren            |
 LD                          |
 a@lokomgrergimi             |
 GOLDON ory OSETTY ESTAUEANT |
 AIENISORSSA                 |
 gal                         |

如果要为每个提取的组分配 id,请使用with ordinalityinFROM子句。

select j.id,j.elem FROM
(
select obj->'text_detail_list'->'pname' as pname_array
  from ele_tbl cross join lateral
jsonb_array_elements(ele_json) obj
)s cross join lateral jsonb_array_elements_text(pname_array)
 with ordinality as j(id,elem)

输出

 id                          | elem
 :-------------------------- | ---:
 GOLDEN oy                   |    1
 gallne                      |    2
 OSETTY EESTAUEA             |    3
 AIsoR                       |    4
 mloachomgrprgren            |    1
 LD                          |    1
 a@lokomgrergimi             |    1
 GOLDON ory OSETTY ESTAUEANT |    1
 AIENISORSSA                 |    2
 gal                         |    3

演示

于 2019-02-28T07:25:59.773 回答