PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rinominare la chiave hstore in PostgreSQL 9.2

Penso che tu abbia ragione sul fatto che devi estrarre la vecchia coppia e reinserire la nuova coppia (con la chiave rinominata).

Potresti farlo con un one-liner:

(h - from_key) || hstore(to_key, h -> from_key)

dove h è l'hstore, from_key è la chiave che vuoi cambiare e to_key è quello in cui vuoi cambiarlo. Ciò restituirà un nuovo hstore con la modifica desiderata ma presuppone che from_key è in h; se from_key non è in h quindi ti ritroverai con un to_key -> NULL nel tuo hstore. Se tu, come tutte le persone sane, non vuoi il NULL randagio, avvolgerei la logica in una semplice funzione per rendere più semplice aggiungere un controllo di esistenza; qualcosa del genere:

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;

Quindi puoi dire entrambi e ottenere i risultati attesi:

=> 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"