मुझे लगता है कि आप सही आप पुराने जोड़ी बाहर निकालते हैं और (नाम बदला कुंजी के साथ) नई जोड़ी डाल करने में वापस आ गया है कि कर रहे हैं
आप इसे एक एक लाइनर के साथ कर सकता:।
(h - from_key) || hstore(to_key, h -> from_key)
जहां h
हैस्टोर है, from_key
वह कुंजी है जिसे आप बदलना चाहते हैं और to_key
वह है जिसे आप इसे बदलना चाहते हैं। वह वांछित परिवर्तन के साथ एक नया हिस्टोर लौटाएगा लेकिन यह मानता है कि from_key
h
में है; यदि from_key
h
में नहीं है तो आप अपने hstore में to_key -> NULL
के साथ समाप्त हो जाएंगे। यदि आप, सभी साधु लोगों की तरह, भटकना नहीं चाहते हैं तो मैं एक सरल कार्य में तर्क को लपेटूंगा ताकि अस्तित्व की जांच को जोड़ना आसान हो; कुछ इस तरह:
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;
तो फिर तुम इन दोनों का कहना है और उम्मीद परिणाम प्राप्त कर सकते हैं:
=> 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"
स्रोत
2012-11-07 19:13:04
सुंदर, धन्यवाद। – Jeff
क्या एक बार में कई कुंजियों का नाम बदलने पर हैस्टोर कॉलम के साथ ~ 1 मिलियन रिकॉर्ड के लिए तेज़ करने का कोई तरीका है? मैं 9.3 पर हूँ। – szimek
@szimek: AFAIK आपको प्रत्येक hstore खोलना होगा, इसे ठीक करना होगा, और इसे वापस रखना होगा (यानी ऊपर के रूप में कठिन तरीका)। आप एक और सवाल पूछने का प्रयास कर सकते हैं ताकि कुछ वास्तविक PostgreSQL विशेषज्ञ मदद कर सकें। –