Ik denk dat je gelijk hebt dat je het oude paar eruit moet halen en het nieuwe paar (met de hernoemde sleutel) er weer in moet steken.
Je zou het kunnen doen met een oneliner:
(h - from_key) || hstore(to_key, h -> from_key)
waar h
is de hstore, from_key
is de sleutel die u wilt wijzigen en to_key
is waarnaar u het wilt veranderen. Dat levert een nieuwe hstore op met de gewenste wijziging, maar het gaat ervan uit dat from_key
is in h
; if from_key
is niet in h
dan krijg je een to_key -> NULL
in uw winkel. Als jij, zoals alle verstandige mensen, de verdwaalde NULL niet wilt, dan zou ik de logica in een eenvoudige functie stoppen om het gemakkelijker te maken om een bestaanscontrole toe te voegen; zoiets als dit:
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;
Dan kun je beide zeggen en de verwachte resultaten krijgen:
=> 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"