聚合列/行并将它们转换为有效的JSON

时间:2014-03-17 14:22:39

标签: sql json postgresql postgresql-9.3

我仍然是PostgreSQL的新手,我在汇总我希望转换为有效JSON的几行和列时遇到了麻烦。

我有一个像这样的表:

 uid |         name        | count 
-----+--------------------+-------
  15 | latergram          |     1
  15 | wales              |     1

我希望将列标记连接起来并计入类似'" name":count'。 之后我想将具有相同uid的行合并到一个JSON对象中。 最终结果应该是这样的:

 uid |          json_agg          
-----+----------------------------
  15 | ["latergram":1, "wales":1]

但我能管理的最好的是,这不是一个有效的JSON:

 uid |          json_agg          
-----+----------------------------
  15 | ["latergram:1", "wales:1"]

这是我使用的查询:

SELECT foo.uid, json_agg(foo.tag) 
from (
    SELECT uid, (concat(tag || ':' || count)) as tag from test 
) as foo 
group by foo.uid

但是,通过Postgres有没有更好,更特别的方法来实现这一目标? 非常感谢帮助!

2 个答案:

答案 0 :(得分:2)

使用yout列name上的to_json()函数生成有效的JSON 您不需要子查询或CTE:

SELECT uid, '[' || string_agg(to_json(name) || ':' || ct, ',') || ']' AS tags
FROM   test
GROUP  BY 1;

使用列名ct而不是count {{1}}。

reserved word in standard SQL

答案 1 :(得分:1)

希望这可以帮助你:

with cte as(
   SELECT id, string_agg('"' || tag || '":' || count, ',') AS tag
   FROM Table1
   GROUP BY id
)
SELECT c.id, ('[' || c.tag || ']') FROM cte AS c

答案的形式如下:

   uid |          json_agg          
    -----+----------------------------
    15 | ["latergram":1, "wales":1]

<强> DEMO