PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да сортирате обекти в масив в json или jsonb стойност по свойство на обектите?

Редът на ключовете в обект в 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);

Но обикновено е по-бавно .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Идемпотентни PostgreSQL DDL скриптове

  2. Случайна грешка на Postgres на Heroku:не може да се преведе името на хост <pg URL> в адрес:Името или услугата не са известни (PG::Error)

  3. Как работи current_time в PostgreSQL

  4. оператор select във функция postgres, извикан вътре в тригер

  5. Как да получите средни стойности за времеви интервали в Postgres