PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres json_agg enthält Spaltenüberschrift - Falsches JSON?

Es ist korrektes JSON in dem Sinne, dass es gültig ist, aber es ist eindeutig nicht das, was Sie wollen. Die Antwort hängt also von der Definition von "richtig" ab. Wir gehen davon aus, dass das, was Sie wollen, "richtig" ist.

Sie fordern es auf, u zu aggregieren , bei dem es sich um eine Ergebnismenge mit der Spalte team handelt . Dies bedeutet, dass diese Informationen zum Ergebnis hinzugefügt werden müssen. Sie sollten nur nach Aggregation von u.team fragen , das ist das gewünschte Feld. Dann erhalten Sie das gewünschte Ergebnis.

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;

Ergebnis: