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

Làm cách nào để sắp xếp các đối tượng trong một mảng bên trong một giá trị json hoặc jsonb theo thuộc tính của các đối tượng?

Thứ tự của các khóa trong một đối tượng trong một jsonb nghĩa đen là không đáng kể - dù sao thì các khóa đối tượng cũng được sắp xếp bên trong. (json khác nhau về vấn đề này.) Xem:

Thứ tự của các phần tử mảng trong một jsonb (hoặc json ) nghĩa đen là có ý nghĩa, mặc dù. Yêu cầu của bạn là có ý nghĩa. Bạn có thể sắp xếp lại như thế này:

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 tại đây

Nhưng nó sẽ hiệu quả hơn để đặt hàng mảng trước gán nó:

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

Theo thứ tự các hàng từ một truy vấn con

Trong SQL chuẩn, thứ tự của các hàng trong một truy vấn con (hoặc bất kỳ biểu thức bảng nào) cũng không đáng kể. Nhưng trong Postgres, thứ tự của các hàng trong truy vấn con được chuyển sang cấp độ tiếp theo. Vì vậy, điều này hoạt động trong các truy vấn đơn giản. Nó thậm chí còn được ghi lại :

Nếu bạn không thể hoặc sẽ không dựa vào điều này, có một giải pháp thay thế an toàn:thêm ORDER BY đến chính hàm tổng hợp. Điều đó thậm chí còn ngắn hơn:

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

Nhưng nó thường chậm hơn .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. LoạiORM Bộ lọc OneToMany trong quan hệ không có hiệu lực để dẫn đến kết quả

  2. Tại sao Postgresql lại thất bại với Geokit như thế này?

  3. Tham khảo bí danh tên cột trong mệnh đề WHERE

  4. Cách tạo Chế độ xem trong PostgreSQL

  5. Sử dụng lại giá trị chọn được tính toán