PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để nối các phần tử mảng jsonb trong Postgres?

Giả sử ít nhất Postgres 9.5, điều này sẽ thực hiện công việc:

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;

Làm thế nào?

  1. Bỏ kết nối jsonb mảng, tạo ra 1 hàng cho mỗi phần tử mảng:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. Đối với mỗi phần tử LEFT JOIN thành images với các điều kiện mà
    a. Chìa khóa 'type' có giá trị 'image':c.elem->>'type' = 'image'
    b. UUID trong image_id khớp với:i.id = (elem->>'image_id')::uuid

  3. Đối với các loại hình ảnh, nơi tìm thấy hình ảnh phù hợp

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

    xóa khóa 'image_id' và thêm hàng hình ảnh liên quan dưới dạng jsonb giá trị:

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

    Khác giữ nguyên phần tử ban đầu.

  4. Tổng hợp lại các phần tử đã sửa đổi thành một content mới cột có jsonb_agg() .

  5. Không điều kiện LEFT JOIN LATERAL kết quả đến posts và chọn tất cả các cột, chỉ thay thế p.content với c.content thay thế được tạo

  6. Trong SELECT bên ngoài , chuyển đổi toàn bộ hàng thành jsonb với một to_jsonb() đơn giản .

Tất cả jsonb các chức năng được ghi lại trong sách hướng dẫn tại đây.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres psql không được nhận dạng là lệnh nội bộ hoặc lệnh bên ngoài

  2. Tối ưu hóa bảng chỉ đọc PostgreSQL

  3. Django cache.set () gây ra lỗi khóa trùng lặp

  4. Làm cách nào để theo dõi tiến trình truy vấn trong PostgreSQL?

  5. PostgreSQL - không thể xác định một toán tử bình đẳng cho kiểu json