Urutan kunci dalam suatu objek dalam jsonb
literal tidak signifikan - kunci objek tetap diurutkan secara internal. (json
berbeda dalam hal ini.) Lihat:
urutan elemen larik dalam jsonb
(atau json
) literal adalah signifikan, meskipun. Permintaan Anda berarti. Anda dapat menyusun ulang seperti ini:
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 di sini
Tapi itu akan lebih efisien untuk memesan larik sebelum menugaskannya:
...
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;
...
Pada urutan baris dari subquery
Dalam SQL standar urutan baris dalam subquery (atau ekspresi tabel apa pun) juga tidak signifikan. Tetapi di Postgres urutan baris dalam subkueri dibawa ke tingkat berikutnya. Jadi ini berfungsi dalam kueri sederhana. Bahkan didokumentasikan :
Jika Anda tidak bisa atau tidak mau mengandalkan ini, ada alternatif yang aman:tambahkan ORDER BY
dengan fungsi agregat itu sendiri. Itu bahkan lebih pendek:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Tapi biasanya lebih lambat .