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

Bagaimana cara bergabung dengan elemen array jsonb di Postgres?

Dengan asumsi setidaknya Postgres 9.5, ini akan berhasil:

SELECT jsonb_pretty(to_jsonb(p)) AS post_row_as_json
FROM  (
   SELECT id, title, author_id, c.content
   FROM   posts p
   LEFT   JOIN LATERAL (
      SELECT jsonb_agg(
               CASE WHEN c.elem->>'type' = 'image' AND i.id IS NOT NULL
                    THEN elem - 'image_id' || jsonb_build_object('image', i)
                    ELSE c.elem END) AS content
      FROM   jsonb_array_elements(p.content) AS c(elem)
      LEFT   JOIN images i ON c.elem->>'type' = 'image'
                          AND i.id = (elem->>'image_id')::uuid
      ) c ON true
   ) p;

Bagaimana?

  1. Hapus sarang jsonb array, menghasilkan 1 baris per elemen array:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. Untuk setiap elemen LEFT JOIN ke images dengan syarat bahwa
    a. Kunci 'type' memiliki nilai 'image':c.elem->>'type' = 'image'
    b. UUID di image_id cocok:i.id = (elem->>'image_id')::uuid

  3. Untuk jenis gambar, di mana gambar yang cocok ditemukan

    c.elem->>'type' = 'image' AND i.id IS NOT NULL
    

    hapus kunci 'image_id' dan tambahkan baris gambar terkait sebagai jsonb nilai:

    elem - 'image_id' || jsonb_build_object('image', i)
    

    Jika tidak, pertahankan elemen aslinya.

  4. Gabungkan kembali elemen yang dimodifikasi ke content baru kolom dengan jsonb_agg() .

  5. Tanpa syarat LEFT JOIN LATERAL hasilnya menjadi posts dan pilih semua kolom, hanya ganti p.content dengan c.content pengganti yang dihasilkan

  6. Di bagian luar SELECT , konversikan seluruh baris ke jsonb dengan to_jsonb() sederhana .

Semua jsonb fungsi didokumentasikan dalam manual di sini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psycopg2 + pgbouncer. Mode asinkron dengan kesalahan gevent

  2. Ekspor data tabel Postgresql menggunakan pgAdmin

  3. PostgreSQL Mencabut Izin dari tabel pg_catalog

  4. Bagaimana pgBouncer membantu mempercepat Django

  5. Cara mengisi database postgresql dengan Mrjob dan Hadoop