在PostgreSQL 9.2中重命名hstore密钥

时间:2012-11-07 16:12:38

标签: postgresql hstore

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

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

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

1 个答案:

答案 0 :(得分:12)

我认为你是对的,你必须拉出旧的一对,然后把新的一对(带有重命名的密钥)放回去。

你可以用单行代码来完成:

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

其中h是hstore,from_key是您要更改的密钥,to_key是您要将其更改为的内容。这将返回一个具有所需更改的新hstore,但它假定from_key位于h;如果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"