2012-11-07 19 views
10

में हैस्टोर कुंजी का नाम बदलना मैं PostgreSQL की hstore कार्यक्षमता (9.2) का मूल्यांकन कर रहा हूं और केवल fine manual कुंजी का नाम बदलने के बारे में स्पष्ट नहीं है। उदाहरण के लिए, मैं cai_count पर कुंजी का नाम कैसे बदल सकता हूं?PostgreSQL 9.2

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

मैं सोच रहा हूँ वहाँ यह करने के लिए कोई सीधा रास्ता है और यह एक ai_count कुंजी को c कुंजी डुप्लिकेट, तो c कुंजी छोड़ने शामिल है कि। मैं यह कैसे कर सकता हूं, आदर्श रूप से एक-लाइनर के रूप में जिसे एकाधिक रिकॉर्ड पर लागू किया जा सकता है?

उत्तर

12

मुझे लगता है कि आप सही आप पुराने जोड़ी बाहर निकालते हैं और (नाम बदला कुंजी के साथ) नई जोड़ी डाल करने में वापस आ गया है कि कर रहे हैं

आप इसे एक एक लाइनर के साथ कर सकता:।

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

जहां h हैस्टोर है, from_key वह कुंजी है जिसे आप बदलना चाहते हैं और to_key वह है जिसे आप इसे बदलना चाहते हैं। वह वांछित परिवर्तन के साथ एक नया हिस्टोर लौटाएगा लेकिन यह मानता है कि from_keyh में है; यदि from_keyh में नहीं है तो आप अपने 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" 
+0

सुंदर, धन्यवाद। – Jeff

+0

क्या एक बार में कई कुंजियों का नाम बदलने पर हैस्टोर कॉलम के साथ ~ 1 मिलियन रिकॉर्ड के लिए तेज़ करने का कोई तरीका है? मैं 9.3 पर हूँ। – szimek

+1

@szimek: AFAIK आपको प्रत्येक hstore खोलना होगा, इसे ठीक करना होगा, और इसे वापस रखना होगा (यानी ऊपर के रूप में कठिन तरीका)। आप एक और सवाल पूछने का प्रयास कर सकते हैं ताकि कुछ वास्तविक PostgreSQL विशेषज्ञ मदद कर सकें। –