我仍然是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有没有更好,更特别的方法来实现这一目标? 非常感谢帮助!
答案 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}}。
答案 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 强>