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

How to break apart Hstore keys and values into separate columns in postgres

我有一个 osm table,其中包含在名为 tags 的 hstore 列中找到的所有标签。

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

所以我的输入是:

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|

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

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))