使用内置函数在Postgres 9.4.2中为JSONB数据类型构建查询

时间:2017-05-04 19:47:58

标签: postgresql postgresql-9.4 jsonb

我有一个表模式如下:

DummyTable
-------------
someData JSONB

我的所有值都是JSON对象。例如,当您执行select * from DummyTable时,它看起来像

someData(JSONB)
------------------
{"values":["P1","P2","P3"],"key":"ProductOne"}
{"values":["P3"],"key":"ProductTwo"}

我想要一个查询,它会给我如下结果集:

[
  {
    "values": ["P1","P2","P3"],
    "key": "ProductOne"
  },
  {
    "values": ["P4"],
   "key": "ProductTwo"
  }
]

我正在使用Postgres版本9.4.2。我查看了相同的文档页面,但找不到会产生上述结果的查询。

但是,在我的API中,我可以通过遍历行来构建JSON,但我更希望查询执行相同的操作。我尝试了json_build_arrayrow_to_jsonselect * from table_name给出的结果,但没有运气。

任何帮助都将不胜感激。

Here是我为JSONB

编写查询所寻找的链接

1 个答案:

答案 0 :(得分:1)

您可以使用json_agg or jsonb_agg

create table dummytable(somedata jsonb not null);
insert into dummytable(somedata) values
  ('{"values":["P1","P2","P3"],"key":"ProductOne"}'),
  ('{"values":["P3"],"key":"ProductTwo"}');
select jsonb_pretty(jsonb_agg(somedata)) from dummytable;

结果:

[
    {
        "key": "ProductOne",
        "values": [
            "P1",
            "P2",
            "P3"
        ]
    },
    {
        "key": "ProductTwo",
        "values": [
            "P3"
        ]
    }
]

尽管逐行检索数据并在客户端构建可以提高效率,因为服务器可以在从存储中检索第一个匹配行之后更快地开始发送数据。如果需要首先构建json数组,则需要检索所有行并合并它们才能开始发送数据。