rækkefølgen af nøgler i et objekt i en jsonb
literal er ubetydelig - objektnøgler sorteres internt alligevel. (json
er anderledes i denne henseende.) Se:
rækkefølgen af matrixelementer i en jsonb
(eller json
) bogstaveligt er dog væsentlig. Din anmodning er meningsfuld. Du kan genbestille på denne måde:
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 her
Men det ville være mere effektivt for at bestille arrayet før tildele det:
...
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 rækkefølgen af rækker fra en underforespørgsel
I standard SQL er rækkefølgen i en underforespørgsel (eller ethvert tabeludtryk) er også ubetydelig. Men i Postgres overføres rækkefølgen af rækker i underforespørgsler til næste niveau. Så dette fungerer i simple forespørgsler. Det er endda dokumenteret :
Hvis du ikke kan eller vil stole på dette, er der et sikkert alternativ:Tilføj en ORDER BY
til selve den samlede funktion. Det er endnu kortere:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Men det er typisk langsommere .