Penso che tu abbia ragione sul fatto che devi estrarre la vecchia coppia e reinserire la nuova coppia (con la chiave rinominata).
Potresti farlo con un one-liner:
(h - from_key) || hstore(to_key, h -> from_key)
dove h
è l'hstore, from_key
è la chiave che vuoi cambiare e to_key
è quello in cui vuoi cambiarlo. Ciò restituirà un nuovo hstore con la modifica desiderata ma presuppone che from_key
è in h
; se from_key
non è in h
quindi ti ritroverai con un to_key -> NULL
nel tuo hstore. Se tu, come tutte le persone sane, non vuoi il NULL randagio, avvolgerei la logica in una semplice funzione per rendere più semplice aggiungere un controllo di esistenza; qualcosa del genere:
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;
Quindi puoi dire entrambi e ottenere i risultati attesi:
=> 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"