sql >> Databasteknik >  >> RDS >> PostgreSQL

Dynamisk transponering för okänt radvärde till kolumnnamn på postgres

Du kan inte ha en "dynamisk" pivot eftersom antalet, namnen och datatyperna för alla kolumner i en fråga måste vara kända för databasen innan frågan exekveras faktiskt (dvs. vid analystid).

Jag tycker att det är lättare att hantera saker i en JSON.

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

Om din frontend kan hantera JSON-värden direkt kan du sluta här.

Om du verkligen behöver en vy med en kolumn per attribut kan du göra dem från JSON-värdet:

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

Jag tycker att detta är lite lättare att hantera när nya attribut läggs till.

Om du behöver en vy med alla etiketter kan du skapa en lagrad procedur för att dynamiskt skapa den. Om antalet olika etiketter inte ändras för ofta kan detta vara 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;

Skapa sedan vyn med:

call create_customer_view();  

Och i din kod använd bara:

select *
from customer_properties;

Du kan schemalägga den proceduren så att den körs med regelbundna intervall (t.ex. genom en cron jobb på Linux)



  1. Tomcat, Java &SQL Server 2008 R2:Kan inte skapa JDBC-drivrutin av klassen '' för anslutnings-URL 'null'

  2. Importera .csv-fil till ett Oracle Forms-program

  3. MySQL kan inte lägga till främmande nyckelbegränsning

  4. Var ställer jag in teckenkodningen i en Java Swing-applikation så att jag kan skriva hindi till en MySQL-databas?