De volgorde van sleutels in een object in een jsonb
letterlijk is onbeduidend - objectsleutels worden hoe dan ook intern gesorteerd. (json
is in dit opzicht anders.) Zie:
De volgorde van array-elementen in een jsonb
(of json
) letterlijk is echter significant. Uw verzoek is zinvol. U kunt als volgt opnieuw ordenen:
SELECT jsonb_agg(elem)
FROM (
SELECT *
FROM jsonb_array_elements(v_combined) a(elem)
ORDER BY (elem->>'ts')::int -- order by integer value of "ts"
) sub;
dbfiddle hier
Maar het zou efficiënter zijn om de array voor te bestellen toewijzen:
...
DECLARE
v_combined jsonb;
BEGIN
SELECT INTO v_combined jsonb_agg(elem)
FROM (
SELECT ts, json_agg(data_table_1) AS j
FROM data_table_1
WHERE fk_id = v_id
UNION ALL
SELECT ts, json_agg(data_table_2)
FROM data_table_2
WHERE fk_id = v_id
ORDER BY ts
) sub;
...
In de volgorde van rijen van een subquery
In standaard SQL de volgorde van rijen in een subquery (of een tabeluitdrukking) is ook onbeduidend. Maar in Postgres wordt de volgorde van rijen in subquery's overgedragen naar het volgende niveau. Dit werkt dus in eenvoudige query's. Het is zelfs gedocumenteerd :
Als je hier niet op kunt of wilt vertrouwen, is er een veilig alternatief:voeg een ORDER BY
toe naar de aggregatiefunctie zelf. Dat is nog korter:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Maar het is meestal langzamer .