4

我对 PostgreSQL 还是很陌生,我无法聚合一些我想转换为有效 JSON 的行和列。

我有一个这样的表:

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

我想连接列标记并计数为“名称”:计数。之后我想将具有相同 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 实现这一目标难道没有更好、特别正确的方法吗?帮助将不胜感激!

4

2 回答 2

2

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

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

使用列名ct而不是标准 SQLcount中的保留字

SQL FIiddle。

于 2014-03-18T09:30:46.423 回答
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]

演示

于 2014-03-17T15:38:32.290 回答