Myślę, że masz rację, że musisz wyciągnąć starą parę i włożyć nową parę (z kluczem o zmienionej nazwie).
Możesz to zrobić za pomocą jednej linijki:
(h - from_key) || hstore(to_key, h -> from_key)
gdzie h
jest hstore, from_key
to klucz, który chcesz zmienić i to_key
jest tym, na co chcesz go zmienić. To zwróci nowy hstore z pożądaną zmianą, ale zakłada, że from_key
jest w h
; jeśli from_key
nie znajduje się w h
wtedy otrzymasz to_key -> NULL
w Twoim hstore. Jeśli ty, jak wszyscy rozsądni ludzie, nie chcesz zabłąkanej wartości NULL, to zapakowałbym logikę w prostą funkcję, aby ułatwić dodanie sprawdzenia istnienia; coś takiego:
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;
Następnie możesz powiedzieć oba te słowa i uzyskać oczekiwane rezultaty:
=> 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"