我从内部联接查询得到以下结果:
SELECT t1.id, t1.label, t2.id, t2.city, t2.ppl
FROM table1 t1
INNER JOIN table2 t2
ON t1.id = t2.country_id
t1.id | t1.标签 | t2.id | t2.city | t2.ppl |
---|---|---|---|---|
1 | 法国 | 1 | 巴黎 | 10800000 |
1 | 法国 | 2 | 里昂 | 522000 |
1 | 法国 | 3 | 马赛 | 870000 |
2 | 英格兰 | 4 | 伦敦 | 9000000 |
2 | 英格兰 | 5 | 利物浦 | 500000 |
2 | 英格兰 | 6 | 曼彻斯特 | 552000 |
如何将第二部分转换为 jsonb 列,如下所示:
t1.id | t1.标签 | t2.myjsonb |
---|---|---|
1 | 法国 | [{“巴黎”:“10800000”,“里昂”:“522000”,“马赛”:“870000”}] |
1 | 英格兰 | [{“伦敦”:“9000000”,“利物浦”:“500000”,“曼彻斯特”:“552000”}] |
如何使用 Postgresql 查询来做到这一点?谢谢
使用
INNER JOIN
,如果 table2 不存在对应的行,则不会获得 table1 的任何结果。 LEFT JOIN
可以解决这个问题,但我认为子查询更简单:
SELECT t1.id, t1.label, (
SELECT jsonb_agg(jsonb_build_object(t2.city, t2.ppl))
FROM table2 t2
WHERE t2.country_id = t1.id
) AS myjsonb
FROM table1 t1;
请注意,对于空结果,
jsonb_agg
返回 NULL
,而不是 []
。为了避免这种情况,您可以使用
SELECT t1.id, t1.label, COALESCE((
SELECT jsonb_agg(jsonb_build_object(t2.city, t2.ppl))
FROM table2 t2
WHERE t2.country_id = t1.id
), '[]'::jsonb) AS myjsonb
FROM table1 t1;
或
SELECT t1.id, t1.label, to_jsonb(ARRAY(
SELECT jsonb_agg(jsonb_build_object(t2.city, t2.ppl))
FROM table2 t2
WHERE t2.country_id = t1.id
)) AS myjsonb
FROM table1 t1;