Pořadí klíčů v objektu v jsonb
doslovný je bezvýznamný - klíče objektů jsou stejně tříděny interně. (json
je v tomto ohledu jiný.) Viz:
Pořadí prvků pole v jsonb
(nebo json
) doslovný je však významný. Vaše žádost je smysluplná. Objednávku můžete změnit takto:
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 zde
Ale bylo by to efektivnější k objednání pole před přiřazování:
...
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;
...
V pořadí řádků z dílčího dotazu
Ve standardním SQL pořadí řádků v poddotazu (nebo v jakémkoli tabulkovém výrazu) je také bezvýznamný. Ale v Postgresu je pořadí řádků v poddotazech přeneseno na další úroveň. Takže to funguje v jednoduchých dotazech. Je to dokonce zdokumentováno :
Pokud se na to nemůžete nebo nechcete spolehnout, existuje bezpečná alternativa:přidejte ORDER BY
k samotné agregační funkci. To je ještě kratší:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Obvykle je však pomalejší .