Het grootste probleem met draaitabellen in Postgres (en andere RDBMS) is dat de structuur (aantal en namen van kolommen) van een queryresultaat niet kan variëren afhankelijk van de geselecteerde gegevens. Een van de mogelijke oplossingen is om dynamisch een view te creëren, welke structuur wordt bepaald door de data. De voorbeeldfunctie maakt een weergave op basis van de tabel example_table
:
create or replace function create_pivot_view()
returns void language plpgsql as $$
declare
list text;
begin
select string_agg(format('jdata->>%1$L "%1$s"', name), ', ')
from (
select distinct name
from example_table
) sub
into list;
execute format($f$
drop view if exists example_pivot_view;
create view example_pivot_view as
select lbl, %s
from (
select lbl, json_object_agg(name, value) jdata
from example_table
group by 1
order by 1
) sub
$f$, list);
end $$;
Gebruik de functie nadat de tabel is gewijzigd (misschien in een trigger) en vraag de gemaakte weergave op:
select create_pivot_view();
select *
from example_pivot_view;
lbl | num | colour | percentage
-----+-----+--------+------------
1 | 1 | Red | 25.0
2 | 2 | Green | 50.0
3 | 3 | Blue | 75.0
(3 rows)
Test het in db<>fiddle.
Houd er rekening mee dat het alleen nodig is om een weergave opnieuw te maken (de functie aan te roepen) nadat een nieuwe naam aan de tabel is toegevoegd (of een naam is verwijderd). Als de set met verschillende namen niet verandert, kunt u de weergave opvragen zonder deze opnieuw te maken. Als de set regelmatig wordt gewijzigd, is het een betere optie om een tijdelijke weergave te maken.
Mogelijk bent u ook geïnteresseerd in Geaggregeerde sleutel/waarde-paren uit een JSONB-veld afvlakken?