Postgresql:如何将某些列转换为json对象?

问题描述 投票:0回答:1

我从内部联接查询得到以下结果:

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 查询来做到这一点?谢谢

postgresql jsonb
1个回答
0
投票

使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.