如何从postgres中的同一个表中获取层次结构json

时间:2015-07-07 09:09:23

标签: sql json postgresql

{
      object_id: 1,
      text: [
         en: { name: xxx, desc: xxx },
         pl: { name: xxx, desc: xxx }
      ]
   }

我的表看起来像这样

id, name, desc, object_id, language

并且一些数据如下所示:

1, xxx, xxx, 1, en
2, xxx, xxx, 2, pl
3, xxx, xxx, 1, pl 
4, xxx, xxx, 2, de

我想聚合响应中文本字段中具有相同object_id的人的名称和desc

我正在制作postgres 9.3

1 个答案:

答案 0 :(得分:1)

该问题包含不准确之处:预期结果不是有效的json,表格未正确定义。

假设表定义为:

link

查询:

var vis = d3.select(element[0]).select(".pie_chart").append("svg")...

生成this valid json

Postgres 9.3解决方案

Postgres 9.4带有强大的功能create table the_table ( id integer, some_name text, -- do not use 'name' for column name descr text, -- 'desc' is invalid column name object_id integer, lang text -- do not use 'language' for column name ) 。 用你自己的函数替换它是不可能的,因为plpgsql不允许select json_agg(json_build_object('object_id', object_id, 'text', js)) from ( select object_id, json_agg(js) js from ( select object_id, lang, json_build_object( lang, json_object(array['name', some_name, 'desc', descr]) ) js from the_table order by lang ) alias group by 1 ) alias 作为参数。 出于Postgres 9.3的目的,我们将使用三个函数来操作文本类型(而不是json),以及最简单的聚合函数json_build_object(variadic "any") (这个解决方案已经足够了,虽然更优雅的是定义我们自己的聚合函数)。

variadic "any"

9.3版本中的查询:

string_agg