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)