Die Reihenfolge der Schlüssel in einem Objekt in einem jsonb
literal ist unbedeutend - Objektschlüssel werden ohnehin intern sortiert. (json
ist in dieser Hinsicht anders.) Siehe:
Die Reihenfolge der Array-Elemente in einem jsonb
(oder json
) wörtlich ist jedoch signifikant. Ihre Anfrage ist sinnvoll. Sie können folgendermaßen neu anordnen:
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
Aber es wäre effizienter um das Array vorher anzuordnen zuweisen:
...
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 der Reihenfolge der Zeilen einer Unterabfrage
In Standard-SQL die Reihenfolge in einer Unterabfrage (oder einem beliebigen Tabellenausdruck) ist ebenfalls unbedeutend. Aber in Postgres wird die Reihenfolge der Zeilen in Unterabfragen auf die nächste Ebene übertragen. Das funktioniert also in einfachen Abfragen. Es ist sogar dokumentiert :
Wenn Sie sich darauf nicht verlassen können oder wollen, gibt es eine sichere Alternative:Fügen Sie einen ORDER BY
hinzu zur Aggregatfunktion selbst. Das ist noch kürzer:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Aber es ist normalerweise langsamer .