sql >> Database >  >> RDS >> PostgreSQL

Dynamisch transponeren voor onbekende rijwaarde naar kolomnaam op postgres

U kunt geen "dynamisch" draaipunt hebben, omdat het aantal, de namen en de gegevenstypen van alle kolommen van een zoekopdracht bekend moeten zijn bij de database voor de query wordt daadwerkelijk uitgevoerd (d.w.z. tijdens de parse-tijd).

Ik vind het makkelijker om dingen samen te voegen in een JSON.

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

Als uw frontend direct met JSON-waarden kan omgaan, kunt u hier stoppen.

Als je echt een weergave nodig hebt met één kolom per attribuut, kun je ze uit de JSON-waarde halen:

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

Ik vind dit een beetje makkelijker te beheren als er nieuwe attributen worden toegevoegd.

Als u een weergave met alle labels nodig hebt, kunt u een opgeslagen procedure maken om deze dynamisch te maken. Als het aantal verschillende labels niet te vaak verandert, kan dit een oplossing zijn:

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;

Maak vervolgens de weergave met:

call create_customer_view();  

En gebruik in je code gewoon:

select *
from customer_properties;

Je kunt die procedure plannen om met regelmatige tussenpozen te worden uitgevoerd (bijvoorbeeld via een cron baan op Linux)



  1. ImportError:Geen module met de naam mysql.connector die Python3 gebruikt?

  2. Racevoorwaarden met mysql_last_id()

  3. Hoe python mysqldb te gebruiken om veel rijen tegelijk in te voegen

  4. MySQL, moet ik verbonden blijven of verbinding maken als dat nodig is?