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

Chuyển đổi động cho giá trị hàng không xác định thành tên cột trên postgres

Bạn không thể có tổng hợp "động" vì số lượng, tên và kiểu dữ liệu của tất cả các cột của truy vấn phải được cơ sở dữ liệu trước truy vấn thực sự được thực thi (tức là tại thời điểm phân tích cú pháp).

Tôi thấy việc tổng hợp mọi thứ vào một JSON dễ xử lý hơn.

select customer_number,
       jsonb_object_agg(label, value) as props
from the_table
group by customer_number

Nếu giao diện người dùng của bạn có thể xử lý trực tiếp các giá trị JSON, bạn có thể dừng ở đây.

Nếu bạn thực sự cần một chế độ xem với một cột cho mỗi thuộc tính, bạn có thể xem chúng từ giá trị JSON:

select customer_number, 
       props ->> 'address' as address,
       props ->> 'phone' as phone,
       props ->> 'email' as email
from (       
  select customer_number,
         jsonb_object_agg(label, value) as props
  from the_table
  group by customer_number
) t

Tôi thấy điều này dễ quản lý hơn một chút khi các thuộc tính mới được thêm vào.

Nếu bạn cần một dạng xem với tất cả các nhãn, bạn có thể tạo một thủ tục được lưu trữ để tạo động nó. Nếu số lượng nhãn khác nhau không thay đổi quá thường xuyên, đây có thể là một giải pháp:

create procedure create_customer_view() 
as
$$
declare
  l_sql text;
  l_columns text;
begin
  select string_agg(distinct format('(props ->> %L) as %I', label, label), ', ')
    into l_columns
  from the_table;
  
  l_sql := 
    'create view customer_properties as 
     select customer_number, '||l_columns||' 
     from (
      select customer_number, jsonb_object_agg(label, value) as props
       from the_table 
       group by customer_number 
     ) t';
  execute l_sql;
end;
$$
language plpgsql;

Sau đó, tạo chế độ xem bằng:

call create_customer_view();  

Và trong mã của bạn, chỉ cần sử dụng:

select *
from customer_properties;

Bạn có thể lập lịch để thủ tục đó chạy trong các khoảng thời gian đều đặn (ví dụ:thông qua cron công việc trên Linux)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tùy chọn thả xuống biểu mẫu Python được điền bởi sql

  2. Làm thế nào để kiểm tra xem một hàng có tồn tại trong một thủ tục được lưu trữ PostgreSQL hay không?

  3. PostgreSQL Tạo cơ sở dữ liệu

  4. Phân tích cú pháp ngày với các múi giờ khác nhau

  5. Truy vấn postgresql giữa các phạm vi ngày