访问JSONB对象数组作为数组对象

时间:2017-08-04 18:30:04

标签: postgresql jsonb

我的Postgres 9.6数据库中有一个JSONB列,大致具有以下结构

[
  {
    "A": "some value",
    "B": "another value",
    "foo": "bar",
    "x": "y"
  },
  {
    "B": "abc",
    "C": "asdf"
  }
]

它始终是一个对象数组,数组元素的数量各不相同。一些对象键位于每个数组元素中,但不是全部。真实物体有更多的钥匙,几百个是常见的。

在某些情况下,我需要为每个数组元素获取特定键的值。例如,如果我想访问键“B”,结果应为

["another value", "abc"]

如果我访问“foo”,结果应为

["bar", null]

是否有一种合理有效的方法来获取SQL查询中特定键的所有值?它应该独立于数组中的对象数量而工作,理想情况下,如果对象中的键数量变得更大,它应该不会变慢。

1 个答案:

答案 0 :(得分:1)

您可以使用jsonb_array_elements提取每个对象,使用ARRAY_AGG在数组中聚合您想要的对象,然后使用array_to_json将其转换为json数组:

WITH j(json) AS (
  VALUES ('[
    {
      "A": "some value",
      "B": "another value",
      "foo": "bar",
      "x": "y"
    },
    {
      "B": "abc",
      "C": "asdf"
    }
  ]'::jsonb)
)
SELECT array_to_json(ARRAY_AGG(elem->'B'))
FROM j, jsonb_array_elements(json) elem
;
      array_to_json
-------------------------
 ["another value","abc"]
(1 row)
WITH j(json) AS (
  VALUES ('[
    {
      "A": "some value",
      "B": "another value",
      "foo": "bar",
      "x": "y"
    },
    {
      "B": "abc",
      "C": "asdf"
    }
  ]'::jsonb)
)
SELECT array_to_json(ARRAY_AGG(elem->'foo'))
FROM j, jsonb_array_elements(json) elem
;
 array_to_json
---------------
 ["bar",null]
(1 row)