2012-11-07 17 views
10

PostgreSQL'in hstore işlevselliğini (9.2) değerlendiriyorum ve fine manual'un açık olmadığı tek şey anahtarların nasıl yeniden adlandırılacağıdır. Örneğin, c anahtarını ai_count olarak nasıl yeniden adlandırabilirim?PostgreSQL 9.2'de hstore anahtarının yeniden adlandırılması

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

Orada bunu yapmak için doğrudan bir yol olduğunu ve daha sonra c anahtarı bırakarak, bir ai_count anahtarına c anahtarı çoğaltarak içerdiğini düşünüyorum. Bunu nasıl yapabilirim, ideal olarak birden çok kayda uygulanabilecek tek liner olarak mı?

cevap

12

Ben size geri dışarı çift eski çekin ve (yeniden adlandırılmış anahtar ile) yeni bir çift koymak zorunda olduğunu haklısın

değerindeki tek astar ile yapabilirdi.

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

Burada h hstore, from_key değiştirmek istediğiniz anahtardır ve to_key değiştirmek istediğiniz şeydir. Bu, istenen değişiklikle yeni bir hstore döndürecek ancak from_key'un h; from_key, h'da yoksa, hstore'unuzda bir to_key -> NULL ile sonuçlanırsınız. Eğer tüm aklı başında olanlar gibi, başıboş NULL istemiyorsanız, mantığı basitçe bir işleve eklemeyi kolaylaştırmak için basit bir işleve koyardım; Böyle bir şey:

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; 

Sonra bu ikisini söylemek ve beklenen sonuçlar alabilirsiniz:

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

güzel teşekkürler. – Jeff

+0

Aynı anda birden çok anahtarı yeniden adlandırırken hstore sütunu ile 1 milyon kayıt için hızlı bir şekilde yapmak için herhangi bir yolu var mı? 9.3 yaşıyorum. – szimek

+1

@szimek: AFAIK her bir hstore'u açmak, düzeltmek ve geri koymak zorundasınız (yani yukarıdaki gibi). Bazı PostgreSQL uzmanlarının yardımcı olabileceği başka bir soru sormayı deneyebilirsiniz. –