sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan sorterer man objekter i et array inde i en json- eller jsonb-værdi efter en egenskab for objekterne?

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 .




  1. PHP og MySQL - hvordan undgår man adgangskode i kildekoden?

  2. Sekventielle gennemløbshastigheder og feeds

  3. Jquery onchange problem i php

  4. Hvordan fungerer FULLTEXT INDEXS på flere kolonner?