Редът на ключовете в обект в jsonb
литералът е незначителен - ключовете на обектите така или иначе се сортират вътрешно. (json
е различен в това отношение.) Вижте:
Редът на елементите на масива в jsonb
(или json
) литералът обаче е важен. Искането ви е смислено. Можете да пренаредите по следния начин:
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 тук
Но би било по-ефективно за да подредите масива преди присвояването му:
...
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;
...
По реда на редовете от подзаявка
В стандартния SQL редът на редовете в подзаявка (или всеки израз на таблица) също е незначителен. Но в Postgres редът на редовете в подзаявките се пренася на следващото ниво. Така че това работи в прости заявки. Дори е документирано :
Ако не можете или не искате да разчитате на това, има безопасна алтернатива:добавете ORDER BY
към самата агрегатна функция. Това е още по-кратко:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Но обикновено е по-бавно .