2017-10-12 6 views
0

Ma table ABC contient seulement 1 colonne comme ci-dessous ::postrgresql divisé seule colonne à plusieurs colonnes en fonction du nom et de la valeur

name=>countryvalue=>India name=>populationvalue=>10000000 name=>rankvalue=>25 name=>typevalue=>developing 
name=>countryvalue=>USA name=>populationvalue=>100000 name=>rankvalue=>3 name=>typevalue=>developed 
name=>countryvalue=>China name=>populationvalue=>15000000 name=>rankvalue=>5 name=>typevalue=>developed 

Mon résultat attendu est comme ci-dessous:

country  population rank type 
India  10000000  25  developing 
USA   100000  3  developed 
China  15000000  5  developed 
+0

La valeur de colonne se compose du nom de colonne et de la valeur ?? – SachinSarawgi

+0

'split_part'? .. –

+0

@SachinSarawgi oui. Il contient à la fois les noms de colonne et la valeur – DSawant

Répondre

0

smth comme?

f=# with tbl(cl) as (select 'name=>countryvalue=>India name=>populationvalue=>10000000 name=>rankvalue=>25 name=>typevalue=>developing'::text) 
, part as (select split_part(cl,'name=>',2) a, split_part(cl,'name=>',3) b, split_part(cl,'name=>',4) c, split_part(cl,'name=>',5) d from tbl) 
select split_part(a,'=>',2),split_part(b,'=>',2),split_part(c,'=>',2),split_part(d,'=>',2) from part; 
split_part | split_part | split_part | split_part 
------------+------------+------------+------------ 
India  | 10000000 | 25   | developing 
(1 row) 

Bien sûr, si l'ordre des colonnes n'est pas accordée - vous avez besoin d'élaborer le délimiteur

ou plus pervers, mais belle façon:

f=# create table rt(country text, population text, rank int, type text); 
CREATE TABLE 
f=# with hs as (select hstore_to_json(substr(replace(replace('name=>countryvalue=>India name=>populationvalue=>10000000 name=>rankvalue=>25 name=>typevalue=>developing',' name=>',','),'value=>','=>'),7)::hstore) a) 
select j.* from hs, json_populate_record(null::rt, a) j; 
country | population | rank | type 
---------+------------+------+------------ 
India | 10000000 | 25 | developing 
(1 row) 

pour cela, vous aurez besoin hstore extension, type préparé (ou table) et enthousiasme