【问题标题】:Renaming hstore key in PostgreSQL 9.2在 PostgreSQL 9.2 中重命名 hstore 键
【发布时间】:2014-06-11 14:48:07
【问题描述】:

我一直在评估 PostgreSQL 的 hstore 功能 (9.2),fine manual 唯一没有明确说明的是如何重命名键。例如,如何将密钥 c 重命名为 ai_count

"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"

我认为没有直接的方法可以做到这一点,它涉及将c 键复制到ai_count 键,然后删除c 键。我怎样才能做到这一点,理想情况下作为一个可以应用于多条记录的单行?

【问题讨论】:

    标签: postgresql hstore


    【解决方案1】:

    我认为你是对的,你必须拔出旧对并将新对(使用重命名的密钥)放回。

    你可以用单线做到这一点:

    (h - from_key) || hstore(to_key, h -> from_key)
    

    h 是 hstore,from_key 是您要更改的键,to_key 是您要更改的键。这将返回一个具有所需更改的新 hstore,但它假定 from_keyh 中;如果from_key 不在h 中,那么你最终会在你的hstore 中得到to_key -> NULL。如果您和所有理智的人一样,不想要杂散的 NULL,那么我会将逻辑包装在一个简单的函数中,以便更容易添加存在检查;像这样:

    create or replace function
    change_hstore_key(h hstore, from_key text, to_key text) returns hstore as $$
    begin
        if h ? from_key then
            return (h - from_key) || hstore(to_key, h -> from_key);
        end if;
        return h;
    end
    $$ language plpgsql;
    

    那么你可以把这两个都说出来,得到预期的结果:

    => select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'b', 'pancakes');
          change_hstore_key       
    ------------------------------
     "pancakes"=>"2", "a"=>"1", "c"=>"3"
    
    => select change_hstore_key('a=>1,b=>2,c=>3'::hstore, 'pancakes', 'X');
          change_hstore_key       
    ------------------------------
     "a"=>"1", "b"=>"2", "c"=>"3"
    

    【讨论】:

    • 在一次重命名多个键时,有什么方法可以用 hstore 列快速处理约 100 万条记录?我在 9.3。
    • @szimek: AFAIK 你必须打开每个 hstore,修复它,然后放回去(即上面的困难方式)。您可以尝试问另一个问题,以便一些真正的 PostgreSQL 专家可以提供帮助。
    • 为避免添加 NULL 值,您可能希望过滤使用 WHERE h ? from_key 更新的记录
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2014-12-05
    • 2020-01-16
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多