Jeg tror, du har ret i, at du skal trække det gamle par ud og sætte det nye par (med den omdøbte nøgle) ind igen.
Du kunne gøre det med en one-liner:
(h - from_key) || hstore(to_key, h -> from_key)
hvor h
er hstore, from_key
er den nøgle, du vil ændre, og to_key
er det, du vil ændre det til. Det vil returnere en ny hstore med den ønskede ændring, men det antager, at from_key
er i h
; hvis from_key
er ikke i h
så ender du med en to_key -> NULL
i din hstore. Hvis du, som alle fornuftige mennesker, ikke vil have den omstrejfende NULL, så ville jeg pakke logikken ind i en simpel funktion for at gøre det nemmere at tilføje et eksistenstjek; noget som dette:
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;
Så kan du sige begge disse og få de forventede resultater:
=> 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"