【问题标题】:How can I translate a PostgreSQL hstore column into a row?如何将 PostgreSQL hstore 列转换为行?
【发布时间】:2013-04-18 20:54:56
【问题描述】:

什么 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 构成表中的列,并且它们的值填充每列中的行?

【问题讨论】:

    标签: sql postgresql hstore


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-10-15
        • 1970-01-01
        • 2019-02-08
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多