PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Umbenennen des hstore-Schlüssels in PostgreSQL 9.2

Ich denke, Sie haben Recht, dass Sie das alte Paar herausziehen und das neue Paar (mit dem umbenannten Schlüssel) wieder einsetzen müssen.

Sie könnten dies mit einem Einzeiler tun:

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

wobei h ist der hstore, from_key ist der Schlüssel, den Sie ändern möchten, und to_key ist das, worauf Sie es ändern möchten. Dadurch wird ein neuer hstore mit der gewünschten Änderung zurückgegeben, es wird jedoch davon ausgegangen, dass from_key ist in h; wenn from_key ist nicht in h dann erhalten Sie am Ende ein to_key -> NULL in deinem hstore. Wenn Sie, wie alle vernünftigen Menschen, die verirrte NULL nicht wollen, würde ich die Logik in eine einfache Funktion packen, um das Hinzufügen einer Existenzprüfung zu vereinfachen. etwa so:

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;

Dann können Sie beides sagen und erhalten die erwarteten Ergebnisse:

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