PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgres json_agg inclut un en-tête de colonne - JSON incorrect ?

C'est JSON correct dans le sens où c'est valide, mais ce n'est clairement pas ce que vous voulez. La réponse dépend donc de la définition de "correct". Nous supposerons que ce que vous voulez est "correct".

Vous lui demandez d'agréger u , qui est un ensemble de résultats avec la colonne team . Cela signifie qu'il devra ajouter ces informations au résultat. Vous ne devez demander que l'agrégation de u.team , qui est le champ souhaité. Ensuite, vous obtiendrez le résultat souhaité.

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;

Résultat :