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"
güzel teşekkürler. – Jeff
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
@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. –