PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Renomeando a chave hstore no PostgreSQL 9.2


Acho que você está certo de que precisa retirar o par antigo e colocar o novo par (com a chave renomeada) de volta.

Você poderia fazer isso com um one-liner:
(h - from_key) || hstore(to_key, h -> from_key)

onde h é o hstore, from_key é a chave que você deseja alterar e to_key é o que você deseja alterar. Isso retornará um novo hstore com a alteração desejada, mas assume que from_key está em h; se from_key não está em h então você terminará com um to_key -> NULL em seu hstore. Se você, como todas as pessoas sãs, não quer o NULL perdido, então eu envolveria a lógica em uma função simples para facilitar a adição de uma verificação de existência; algo assim:
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;

Então você pode dizer ambos e obter os 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"