我一直在评估PostgreSQL的hstore功能(9.2),而fine manual唯一不明确的是如何重命名键。例如,如何将键c重命名为ai_count
"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"
我在想没有直接的方法可以做到这一点,它涉及将c key 复制到ai_count key ,然后删除c key 。我如何才能做到这一点?理想情况下,如何将其应用于多个记录?

最佳答案

我认为您是对的,您必须拉出旧的一对,然后将新的一对(使用重命名的 key )放回去。

您可以单线执行此操作:

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

其中h是hstore,from_key是您想要更改的 key ,to_key是您想要更改的 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"

关于postgresql - 在PostgreSQL 9.2中重命名hstore key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13273667/

10-15 18:25