PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgres json_agg inclui cabeçalho de coluna - JSON incorreto?


É JSON correto no sentido de que é válido, mas claramente não é o que você deseja. Portanto, a resposta depende da definição de "correto". Vamos supor que o que você quer é "correto".

Você está pedindo para agregar u , que é um conjunto de resultados com a coluna team . Isso significa que ele terá que adicionar essa informação ao resultado. Você só deve solicitar a agregação de u.team , que é o campo que você deseja. Então você terá o resultado que deseja.
WITH matches as
(
select 5 as id, '{"Id":1,"Teams":[{"Name":"TeamA","Players":[{"Name":"AAA"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"CCC"},{"Name":"DDD"}]}],"TeamRank":[1,2]}'::json as match
union all
select 6 as id, '{"Id":2,"Teams":[{"Name":"TeamA","Players":[{"Name":"CCC"},{"Name":"BBB"}]},{"Name":"TeamB","Players":[{"Name":"AAA"},{"Name":"DDD"}]}],"TeamRank":[1,2]}' as match
)
SELECT json_agg(u.team) FROM (
SELECT DISTINCT ON (t.team->>'Name') t.team
FROM   matches m, json_array_elements(m.match->'Teams') t(team)
ORDER  BY t.team->>'Name', m.id DESC) AS u;

Resultado: