如何将 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))
我有一个 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))