यदि आप Postgresql 9.5 में अपग्रेड करने में सक्षम हैं, तो jsonb_set
कमांड उपलब्ध है, जैसा कि अन्य ने उल्लेख किया है।
निम्नलिखित प्रत्येक एसक्यूएल बयान में, मैंने where
संक्षिप्तता के लिए खंड को छोड़ दिया है ; जाहिर है, आप उसे वापस जोड़ना चाहते हैं।
अद्यतन नाम:
UPDATE test SET data = jsonb_set(data, '{name}', '"my-other-name"');
टैग बदलें (टैग जोड़ने या हटाने के विरोध के रूप में):
UPDATE test SET data = jsonb_set(data, '{tags}', '["tag3", "tag4"]');
दूसरा टैग बदलना (0-अनुक्रमित):
UPDATE test SET data = jsonb_set(data, '{tags,1}', '"tag5"');
एक टैग को जोड़ें ( यह तब तक काम करेगा जब तक 999 से कम टैग नहीं होंगे। तर्क 999 से 1000 या उससे अधिक होने पर त्रुटि उत्पन्न होती है । यह अब Postgres 9.5.3 में मामला प्रतीत नहीं होता है; एक बहुत बड़े सूचकांक का उपयोग किया जा सकता है) :
UPDATE test SET data = jsonb_set(data, '{tags,999999999}', '"tag6"', true);
अंतिम टैग निकालें:
UPDATE test SET data = data #- '{tags,-1}'
जटिल अपडेट (अंतिम टैग हटाएं, नया टैग डालें और नाम बदलें):
UPDATE test SET data = jsonb_set(
jsonb_set(data #- '{tags,-1}', '{tags,999999999}', '"tag3"', true),
'{name}', '"my-other-name"');
यह नोट करना महत्वपूर्ण है कि इनमें से प्रत्येक उदाहरण में, आप वास्तव में JSON डेटा के किसी एक क्षेत्र को अपडेट नहीं कर रहे हैं। इसके बजाय, आप डेटा का एक अस्थायी, संशोधित संस्करण बना रहे हैं और उस संशोधित संस्करण को कॉलम पर वापस भेज रहे हैं। व्यवहार में, परिणाम समान होना चाहिए, लेकिन इसे ध्यान में रखते हुए जटिल अपडेट करना चाहिए, पिछले उदाहरण की तरह, अधिक समझने योग्य।
जटिल उदाहरण में, तीन परिवर्तन और तीन अस्थायी संस्करण हैं: पहला, अंतिम टैग हटा दिया गया है। फिर, उस संस्करण को एक नया टैग जोड़कर बदल दिया जाता है। अगला, दूसरा संस्करण name
फ़ील्ड को बदलकर बदल दिया जाता है । data
कॉलम में मान को अंतिम संस्करण से बदल दिया जाता है।