如何将Hstore键和值拆分为postgres中的单独列

时间:2016-06-02 21:12:48

标签: postgresql tags openstreetmap hstore

我有一个osm表,其中包含hstore列中名为tags的所有标记。

我想编写一个查询,它将返回一个包含表的所有列的表,以及每个标记的附加列,每个标记的每个键都作为列名和下面的值。我该怎么做?

所以我的意见是:

Item_id | tags |
----------+-------+
1614     | apple=2,bees=150|
1938     | apple=1,bees=50  |
1983     | apple=1,bees=50  |
1322     | apple=1,bees=100|

输出将是脚本

item_id | apple |  bees 
---------+-------+------
   1614  |   2   |  150
   1938  |   1   |  50
   1983  |   1   |  50
   1322  |   1   |  100

考虑到每一行都有不同数量的标签,我不知道什么是计数以及每列附加的键是什么,所以我该怎么办呢?例如

     Item_id | tags |
    ----------+-------+
    1614     | apple=2,bees=150,green=345|
    1938     | apple=1,bees=50  |
    1983     | apple=1,bees=50  |
    1322     | apple=1,bees=100,red=346|

输出将是:

  item_id | apple |  bees |  green | red|
    ---------+-------+----+--------+----+
       1614  |   2   |  150 |345| NULL|
       1938  |   1   |  50  |NULL| NULL|
       1983  |   1   |  50  |NULL| NULL|
       1322  |   1   |  100 |NULL| 346|

1 个答案:

答案 0 :(得分:0)

这是一个接受表名和键列表的函数。然后它创建新的表和列。它演示了如何在函数中执行动态命令。最后的SELECT显示了如何提取密钥。填充表可以通过在创建列后循环遍历现有表的行来完成。几乎可以肯定有一种更优雅/更有效的方法来完成所有这些:)

CREATE OR REPLACE FUNCTION explode_hstore(tname text, keys TEXT[]) RETURNS VOID AS $$ DECLARE k TEXT; BEGIN RAISE NOTICE 'Creating table=%', tname; EXECUTE 'CREATE TABLE ' || tname || ' ()'; FOREACH k IN ARRAY keys LOOP RAISE NOTICE 'Adding column for key=%', k; EXECUTE 'ALTER TABLE ' || tname || ' ADD COLUMN ' || k || ' TEXT'; END LOOP; END; $$ LANGUAGE plpgsql;

运行该功能:

SELECT explode_hstore('exploded_hstore', (select array_agg(x.keys) FROM (SELECT skeys("data") AS keys FROM hstoretest GROUP BY keys) x))