kolejność kluczy w obiekcie w jsonb
literał jest nieistotny - klucze obiektów i tak są sortowane wewnętrznie. (json
różni się pod tym względem.) Zobacz:
kolejność elementów tablicy w jsonb
(lub json
) literał ma jednak znaczenie. Twoja prośba ma sens. Możesz zmienić kolejność w ten sposób:
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 tutaj
Ale byłoby bardziej wydajne zamówić tablicę przed przypisywanie go:
...
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;
...
W kolejności wierszy z podzapytania
W standardowym SQL kolejność wierszy w podzapytaniu (lub dowolnym wyrażeniu tabeli) również nie ma znaczenia. Ale w Postgresie kolejność wierszy w podzapytaniach jest przenoszona na wyższy poziom. Więc to działa w prostych zapytaniach. Jest nawet udokumentowany :
Jeśli nie możesz lub nie chcesz na tym polegać, istnieje bezpieczna alternatywa:dodaj ORDER BY
do samej funkcji agregującej. To jeszcze krócej:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Ale zazwyczaj jest wolniej .