Myslím, že máte pravdu, že musíte vytáhnout starý pár a vložit nový pár (s přejmenovaným klíčem) zpět.
Mohli byste to udělat s jednovrstvou:
(h - from_key) || hstore(to_key, h -> from_key)
kde h
je hstore, from_key
je klíč, který chcete změnit, a to_key
je to, na co to chcete změnit. To vrátí nový hstore s požadovanou změnou, ale předpokládá to from_key
je v h
; if from_key
není v h
pak skončíte s to_key -> NULL
ve vašem hstore. Pokud jako všichni příčetní lidé nechcete zbloudilou NULL, pak bych logiku zabalil do jednoduché funkce, aby bylo snazší přidat kontrolu existence; něco takového:
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;
Pak můžete říci obojí a získat očekávané výsledky:
=> 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"