オブジェクト内のキーの順序 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);
ただし、通常は遅い 。