Мисля, че сте прав, че трябва да извадите стария чифт и да поставите новия чифт (с преименувания ключ) обратно.
Можете да го направите с един ред:
(h - from_key) || hstore(to_key, h -> from_key)
където h
е hstore, from_key
е ключът, който искате да промените, и to_key
е това, на което искате да го промените. Това ще върне нов hstore с желаната промяна, но предполага, че from_key
е в h
; ако from_key
не е в h
тогава ще завършите с to_key -> NULL
във вашия hstore. Ако вие, като всички здравомислещи хора, не искате бездомната NULL, тогава бих опаковал логиката в проста функция, за да улесня добавянето на проверка за съществуване; нещо подобно:
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;
След това можете да кажете и двете и да получите очакваните резултати:
=> 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"