sql >> Database teknologi >  >> RDS >> PostgreSQL

Dynamisk transponering for ukendt rækkeværdi til kolonnenavn på postgres

Du kan ikke have en "dynamisk" pivot, da antallet, navnene og datatyperne for alle kolonner i en forespørgsel skal være kendt af databasen før forespørgslen udføres faktisk (dvs. på parsetidspunkt).

Jeg synes, det er lettere at håndtere ting at samle ting i en JSON.

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

Hvis din frontend kan håndtere JSON-værdier direkte, kan du stoppe her.

Hvis du virkelig har brug for en visning med én kolonne pr. attribut, kan du bruge dem fra JSON-værdien:

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

Jeg synes, det er lidt nemmere at administrere, når nye attributter tilføjes.

Hvis du har brug for en visning med alle etiketter, kan du oprette en lagret procedure for dynamisk at oprette den. Hvis antallet af forskellige etiketter ikke ændres for ofte, kan dette være en løsning:

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;

Opret derefter visningen ved hjælp af:

call create_customer_view();  

Og i din kode skal du bare bruge:

select *
from customer_properties;

Du kan planlægge denne procedure til at køre med regelmæssige intervaller (f.eks. gennem en cron job på Linux)



  1. Hvad er nyt i MariaDB 10.4

  2. Bestil ved at bruge polske bogstaver

  3. formindsk en database i oracle 11g

  4. Aritmetisk overløbsfejl ved konvertering af udtryk til datatype int