Creo que tienes razón en que tienes que sacar el par viejo y volver a colocar el par nuevo (con la clave renombrada).
Podrías hacerlo con una sola línea:
(h - from_key) || hstore(to_key, h -> from_key)
donde h
es el hstore, from_key
es la clave que desea cambiar y to_key
es a lo que quieres cambiarlo. Eso devolverá un nuevo hstore con el cambio deseado pero asume que from_key
está en h
; si from_key
no está en h
entonces terminará con un to_key -> NULL
en tu tienda. Si usted, como todas las personas cuerdas, no quiere el NULL extraviado, entonces envolvería la lógica en una función simple para que sea más fácil agregar una verificación de existencia; algo como esto:
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;
Luego puede decir ambas cosas y obtener los resultados esperados:
=> 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"