PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie sortiert man Objekte in einem Array innerhalb eines JSON- oder JSONB-Werts nach einer Eigenschaft der Objekte?

Die Reihenfolge der Schlüssel in einem Objekt in einem jsonb literal ist unbedeutend - Objektschlüssel werden ohnehin intern sortiert. (json ist in dieser Hinsicht anders.) Siehe:

Die Reihenfolge der Array-Elemente in einem jsonb (oder json ) wörtlich ist jedoch signifikant. Ihre Anfrage ist sinnvoll. Sie können folgendermaßen neu anordnen:

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 hier

Aber es wäre effizienter um das Array vorher anzuordnen zuweisen:

...
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;
...

In der Reihenfolge der Zeilen einer Unterabfrage

In Standard-SQL die Reihenfolge in einer Unterabfrage (oder einem beliebigen Tabellenausdruck) ist ebenfalls unbedeutend. Aber in Postgres wird die Reihenfolge der Zeilen in Unterabfragen auf die nächste Ebene übertragen. Das funktioniert also in einfachen Abfragen. Es ist sogar dokumentiert :

Wenn Sie sich darauf nicht verlassen können oder wollen, gibt es eine sichere Alternative:Fügen Sie einen ORDER BY hinzu zur Aggregatfunktion selbst. Das ist noch kürzer:

SELECT INTO v_combined  jsonb_agg(elem  ORDER BY (elem->>'ts')::int)
FROM   jsonb_array_elements(v_combined) a(elem);

Aber es ist normalerweise langsamer .