4

什么 SQL 查询会将PostgreSQL hstore列转换为常规表,其中所有 hstore 行中的不同键形成表中的列,值填充相应列中的行?

例如,如何转换 hstore 列

hstore
------------------------------------
"a"=>"1", "b"=>"2", "c"=>"3"
"a"=>"4", "b"=>"6", "c"=>"5", "d"=>7
"a"=>"8", "b"=>"3", "c"=>"8"

进入“等效”表

a   b   c   d
---------------
 1 | 2 | 3 |
 4 | 6 | 5 | 7 
 8 | 3 | 8 |

其中不同的 hstore 键 a、b、c 和 d 构成表中的列,它们的值填充每列中的行?

4

2 回答 2

5

您不能动态执行此操作,但如果您创建与输出匹配的类型,则可以执行此操作。

create table foo (data hstore);
create type foo_type as (a text, b text, c text);

insert into foo (data) 
values 
('a => 1, b => 2'),
('a => 1, b=>2, c => 3'),
('a => 1');

select (populate_record(null::foo_type, data)).*
from foo;

返回:

一个 | 乙 | C
--+----+--
1 | 2 |  
1 | 2 | 3
1 | |  

请注意,如果您有一个与您想要的列匹配的表,您也可以使用“表类型”。

于 2013-04-18T21:12:29.317 回答
1

我知道问题已得到解答,但我遇到了类似的问题。我需要转换 hstore 值,以便可以直接将数据插入到表中。这是我得到的解决方案:

INSERT INTO foo 
SELECT (populate_record(null::foo, 'a => 1, b=>2, c => 3'::hstore)).*;

当然,hstore 列必须在表中,否则它们将被忽略。希望这可以帮助像我一样最终来到这里的其他人。:)

于 2016-02-05T14:04:14.290 回答