2012-11-07 10 views
10

Sto valutando la funzionalità di histore di PostgreSQL (9.2) e l'unica cosa che lo fine manual non è esplicita riguarda la modalità di ridenominazione delle chiavi. Ad esempio, come è possibile rinominare la chiave c in ai_count?Ridenominazione della chiave hstore in PostgreSQL 9.2

"c"=>"3", "ai_voltage"=>"3", "ai_temperature"=>"28"

sto pensando non v'è alcun modo diretto per fare questo e che si tratta di duplicare la chiave c a una chiave ai_count, quindi far cadere la chiave c. Come posso fare questo, idealmente come un one-liner che può essere applicato a più record?

risposta

12

penso che tu abbia ragione che si deve tirare il vecchio paio fuori e mettere la nuova coppia (con la chiave rinominato) indietro nel

si potrebbe fare con una battuta:.

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

dove h è lo store, from_key è la chiave che si desidera modificare e to_key è ciò che si desidera modificare. Ciò restituirà un nuovo hstore con la modifica desiderata ma presuppone che from_key sia in h; se from_key non è in h, ti ritroverai con uno to_key -> NULL nel tuo archivio. Se tu, come tutte le persone sane, non vuoi il randagio NULL, allora avvolgerei la logica in una semplice funzione per rendere più facile aggiungere un controllo dell'esistenza; qualcosa di simile:

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; 

allora si può dire sia di questi e di 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" 
+0

bello, grazie. – Jeff

+0

C'è un modo per farlo velocemente per ~ 1 milione di record con la colonna di hstore quando si rinomina più chiavi contemporaneamente? Sono al 9.3. – szimek

+1

@szimek: AFAIK dovresti aprire ogni hstore, sistemarlo e rimetterlo (cioè nel modo più duro come sopra). Potresti provare a fare un'altra domanda in modo che alcuni dei veri esperti di PostgreSQL possano aiutarti. –

Problemi correlati