Nycklarnas ordning i ett objekt i en jsonb
literal är obetydlig - objektnycklar sorteras internt ändå. (json
är annorlunda i detta avseende.) Se:
ordningen av arrayelement i en jsonb
(eller json
) bokstavlig är dock betydelsefull. Din begäran är meningsfull. Du kan beställa om så här:
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 här
Men det skulle vara effektivare för att beställa arrayen före tilldela den:
...
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;
...
I ordningen för rader från en underfråga
I standard SQL ordning av rader i en underfråga (eller något tabelluttryck) är också obetydlig. Men i Postgres överförs ordningen på rader i underfrågor till nästa nivå. Så detta fungerar i enkla frågor. Det är till och med dokumenterat :
Om du inte kan eller vill lita på detta finns det ett säkert alternativ:lägg till en ORDER BY
till själva den aggregerade funktionen. Det är ännu kortare:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Men det är vanligtvis långsammare .