Thứ tự của các khóa trong một đối tượng trong một jsonb
nghĩa đen là không đáng kể - dù sao thì các khóa đối tượng cũng được sắp xếp bên trong. (json
khác nhau về vấn đề này.) Xem:
Thứ tự của các phần tử mảng trong một jsonb
(hoặc json
) nghĩa đen là có ý nghĩa, mặc dù. Yêu cầu của bạn là có ý nghĩa. Bạn có thể sắp xếp lại như thế này:
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 tại đây
Nhưng nó sẽ hiệu quả hơn để đặt hàng mảng trước gán 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;
...
Theo thứ tự các hàng từ một truy vấn con
Trong SQL chuẩn, thứ tự của các hàng trong một truy vấn con (hoặc bất kỳ biểu thức bảng nào) cũng không đáng kể. Nhưng trong Postgres, thứ tự của các hàng trong truy vấn con được chuyển sang cấp độ tiếp theo. Vì vậy, điều này hoạt động trong các truy vấn đơn giản. Nó thậm chí còn được ghi lại :
Nếu bạn không thể hoặc sẽ không dựa vào điều này, có một giải pháp thay thế an toàn:thêm ORDER BY
đến chính hàm tổng hợp. Điều đó thậm chí còn ngắn hơn:
SELECT INTO v_combined jsonb_agg(elem ORDER BY (elem->>'ts')::int)
FROM jsonb_array_elements(v_combined) a(elem);
Nhưng nó thường chậm hơn .