我一直在评估 PostgreSQL 的 hstore 功能(9.2),而精美的手册唯一没有明确说明的是如何重命名键。例如,我如何将密钥重命名c
为ai_count
?
"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"
我认为没有直接的方法可以做到这一点,它涉及将密钥复制c
到ai_count
密钥,然后删除c
密钥。我怎样才能做到这一点,理想情况下作为一个可以应用于多个记录的单行?
我一直在评估 PostgreSQL 的 hstore 功能(9.2),而精美的手册唯一没有明确说明的是如何重命名键。例如,我如何将密钥重命名c
为ai_count
?
"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"
我认为没有直接的方法可以做到这一点,它涉及将密钥复制c
到ai_count
密钥,然后删除c
密钥。我怎样才能做到这一点,理想情况下作为一个可以应用于多个记录的单行?
我认为您是对的,您必须将旧对拔出并将新对(使用重命名的密钥)放回原处。
你可以用单线做到这一点:
(h - from_key) || hstore(to_key, h -> from_key)
h
hstore 在哪里,是from_key
您要更改的密钥,to_key
也是您要更改的内容。这将返回一个具有所需更改的新 hstore,但它假定它from_key
位于h
; 如果from_key
不在,h
那么你最终会to_key -> NULL
在你的 hstore 中得到 a。如果您像所有理智的人一样,不想要杂散的 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"