PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak posortować obiekty w tablicy wewnątrz wartości json lub jsonb według właściwości obiektów?

kolejność kluczy w obiekcie w jsonb literał jest nieistotny - klucze obiektów i tak są sortowane wewnętrznie. (json różni się pod tym względem.) Zobacz:

kolejność elementów tablicy w jsonb (lub json ) literał ma jednak znaczenie. Twoja prośba ma sens. Możesz zmienić kolejność w ten sposób:

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 tutaj

Ale byłoby bardziej wydajne zamówić tablicę przed przypisywanie go:

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

W kolejności wierszy z podzapytania

W standardowym SQL kolejność wierszy w podzapytaniu (lub dowolnym wyrażeniu tabeli) również nie ma znaczenia. Ale w Postgresie kolejność wierszy w podzapytaniach jest przenoszona na wyższy poziom. Więc to działa w prostych zapytaniach. Jest nawet udokumentowany :

Jeśli nie możesz lub nie chcesz na tym polegać, istnieje bezpieczna alternatywa:dodaj ORDER BY do samej funkcji agregującej. To jeszcze krócej:

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

Ale zazwyczaj jest wolniej .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. domyślna strefa czasowa postgres

  2. Przekazywanie zestawu wyników do funkcji Postgresql

  3. Sprawdzenie minimalnej zmienności w R lub PostgreSQL

  4. Rola Postgresql Docker nie istnieje

  5. 3 sposoby na wyświetlenie listy wszystkich procedur składowanych w bazie danych PostgreSQL