PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengurutkan objek dalam array di dalam nilai json atau jsonb berdasarkan properti objek?

Urutan kunci dalam suatu objek dalam jsonb literal tidak signifikan - kunci objek tetap diurutkan secara internal. (json berbeda dalam hal ini.) Lihat:

urutan elemen larik dalam jsonb (atau json ) literal adalah signifikan, meskipun. Permintaan Anda berarti. Anda dapat menyusun ulang seperti ini:

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 di sini

Tapi itu akan lebih efisien untuk memesan larik sebelum menugaskannya:

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

Pada urutan baris dari subquery

Dalam SQL standar urutan baris dalam subquery (atau ekspresi tabel apa pun) juga tidak signifikan. Tetapi di Postgres urutan baris dalam subkueri dibawa ke tingkat berikutnya. Jadi ini berfungsi dalam kueri sederhana. Bahkan didokumentasikan :

Jika Anda tidak bisa atau tidak mau mengandalkan ini, ada alternatif yang aman:tambahkan ORDER BY dengan fungsi agregat itu sendiri. Itu bahkan lebih pendek:

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

Tapi biasanya lebih lambat .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menyimpan file di postgres menggunakan node-postgres

  2. Saya mencoba mengubah postgresql md5 menjadi scram-sha-256 dan saya mendapatkan otentikasi kata sandi FATAL gagal

  3. Kembalikan nilai kolom pra-PERBARUI menggunakan SQL saja

  4. membandingkan string di PostgreSQL

  5. Memantau Distribusi Percona untuk PostgreSQL - Metrik Utama