Я думаю, вы правы, что вам нужно вытащить старую пару и вставить новую пару (с переименованным ключом) обратно.
Вы можете сделать это с помощью одной строки:
(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"
person
mu is too short
schedule
07.11.2012