sql >> Database >  >> RDS >> PostgreSQL

Hoe objecten in een array in een json- of jsonb-waarde te sorteren op een eigenschap van de objecten?

De volgorde van sleutels in een object in een jsonb letterlijk is onbeduidend - objectsleutels worden hoe dan ook intern gesorteerd. (json is in dit opzicht anders.) Zie:

De volgorde van array-elementen in een jsonb (of json ) letterlijk is echter significant. Uw verzoek is zinvol. U kunt als volgt opnieuw ordenen:

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

Maar het zou efficiënter zijn om de array voor te bestellen toewijzen:

...
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 de volgorde van rijen van een subquery

In standaard SQL de volgorde van rijen in een subquery (of een tabeluitdrukking) is ook onbeduidend. Maar in Postgres wordt de volgorde van rijen in subquery's overgedragen naar het volgende niveau. Dit werkt dus in eenvoudige query's. Het is zelfs gedocumenteerd :

Als je hier niet op kunt of wilt vertrouwen, is er een veilig alternatief:voeg een ORDER BY toe naar de aggregatiefunctie zelf. Dat is nog korter:

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

Maar het is meestal langzamer .




  1. MySQL:fout 150 bij gebruik van ON UPDATE SET NULL en ON DELETE SET NULL, waarom?

  2. Vind het aantal rijen in de eerste tabel die overeenkomen met de id's van de rij van de tweede tabel met de maximale datum

  3. Hoe stel ik een standaard standaardafbeelding (no_pic.gif) php in?

  4. PHP mySQL-zoekfunctie voegt zich bij verschillende velden