sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur sorterar man objekt i en array i ett json- eller jsonb-värde efter en egenskap hos objekten?

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 .




  1. ORA-02019:anslutningsbeskrivning för fjärrdatabas hittades inte

  2. Överträdelse av begränsningar när en till många-relation består

  3. installera och konfigurera OCI8 för att ansluta oracle till php

  4. Oracle kumulativt antal med SYS_CONNECT_BY_PATH