SQLite json_replace()
फ़ंक्शन हमें JSON दस्तावेज़ में मौजूदा मान को किसी अन्य मान से बदलने की अनुमति देता है।
जब हम फ़ंक्शन को कॉल करते हैं, तो हम मूल JSON को पहले तर्क के रूप में पास करते हैं, उसके बाद मान के पथ को प्रतिस्थापित करने के लिए, उसके बाद मान को प्रतिस्थापित करने के लिए।
यदि आवश्यक हो तो हम एकाधिक कुंजी/मान जोड़े भी बदल सकते हैं।
सिंटैक्स
यह इस तरह काम करता है:
json_replace(json, path1, value1, path2, value2...)
जहां json
मूल JSON का प्रतिनिधित्व करता है, और path1, value1, path2, value2...
बदलने के लिए पथ/मान जोड़े हैं।
उदाहरण
प्रदर्शित करने के लिए यहां एक बुनियादी उदाहरण दिया गया है:
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
परिणाम:
{"name":"Baldy"}
यहां, मैंने name
. का मान अपडेट किया है Fluffy
. से कुंजी करने के लिए Baldy
।
हम इस तरह से कई की/वैल्यू पेयर अपडेट कर सकते हैं:
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
परिणाम:
{"name":"Baldy","age":11}
जब मैंने json_replace()
. को कॉल किया, तो मैंने बस अधिक कुंजी/मान तर्क जोड़े ।
यहां, मैंने कोड को पढ़ने में आसान बनाने के लिए लाइन ब्रेक का उपयोग किया। यह सब एक पंक्ति में हो सकता था - परिणाम एक जैसा होता।
क्या होगा यदि कुंजी मौजूद नहीं है?
यदि JSON में कुंजी पहले से मौजूद नहीं है, तो कुछ भी नहीं बदला गया है:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
परिणाम:
{"name":"Fluffy"}
यह मुख्य विशेषता है जो json_replace()
. को अलग करती है json_set()
. से फ़ंक्शन और json_insert()
कार्य। यदि कुंजी पहले से मौजूद नहीं है तो वे फ़ंक्शन मान डालेंगे।
हालांकि, json_replace()
. के साथ नई कुंजियों को प्रभावी ढंग से सम्मिलित करना संभव है संपूर्ण JSON ऑब्जेक्ट/दस्तावेज़ को बदलकर। नीचे उदाहरण।
संपूर्ण JSON दस्तावेज़ बदलें
हम json_replace()
का उपयोग कर सकते हैं पूरे JSON दस्तावेज़ को दूसरे के साथ बदलने के लिए:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
परिणाम:
{"name":"Baldy"}
इसलिए यह हमें दस्तावेज़ में नई कुंजी को प्रभावी ढंग से सम्मिलित करने में सक्षम बनाता है:
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
परिणाम:
{"name":"Baldy","age":11}
कड़ाई से बोलते हुए, हमने कोई नई कुंजी नहीं डाली। हमने बस पूरे दस्तावेज़ को बदल दिया। लेकिन परिणाम एक JSON दस्तावेज़ था जिसमें कुंजियाँ शामिल थीं जो मूल में नहीं थीं।
एम्बेडेड ऑब्जेक्ट बदलें
हम एम्बेडेड ऑब्जेक्ट्स को भी बदल सकते हैं:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
परिणाम:
{"a":1,"b":{"c":2}}
जब मैंने ऐसा किया, तो मैंने json()
. का इस्तेमाल किया JSON स्ट्रिंग के रूप में मेरे तर्क को वापस करने के लिए कार्य करें। जब मैं ऐसा नहीं करता तो क्या होता है:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
परिणाम:
{"a":1,"b":"{ \"c\" : 2 }"}
JSON दस्तावेज़ को JSON ऑब्जेक्ट के बजाय टेक्स्ट मान के रूप में डाला जाता है, और इसलिए इसके दोहरे उद्धरण बैकस्लैश से बच जाते हैं।
हालांकि, हम केवल सिंगल कोट्स को नहीं हटा सकते, क्योंकि इससे एक त्रुटि होती है:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
परिणाम:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
सिंगल कोट्स या json()
. के बिना फ़ंक्शन, जैसे ही यह बाएं घुंघराले ब्रेस का सामना करता है, हमें एक त्रुटि मिलती है। इसलिए हमें सिंगल कोट्स या json()
. का उपयोग करने की आवश्यकता है फ़ंक्शन, इस पर निर्भर करता है कि हम JSON ऑब्जेक्ट या SQL स्ट्रिंग/टेक्स्ट मान सम्मिलित कर रहे हैं।
JSON ऑब्जेक्ट डालने का दूसरा तरीका json_object()
. का उपयोग करना है json()
. के बजाय फ़ंक्शन समारोह:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
परिणाम:
{"a":1,"b":{"c":2}}
एक सरणी बदलें
यही अवधारणा सरणियों के साथ लागू होती है:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
परिणाम:
{"a":[5,6,7]}
अगर हम json()
. को हटा दें फ़ंक्शन, हमें यह मिलता है:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
परिणाम:
{"a":"[ 5, 6, 7 ]"}
और अगर हम सिंगल कोट्स हटाते हैं, तो हमें एक त्रुटि मिलती है:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
परिणाम:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
हम वैकल्पिक रूप से json_array()
. का उपयोग कर सकते हैं json()
. के बजाय फ़ंक्शन . वह फ़ंक्शन आपको इसके तर्कों के आधार पर एक सरणी बनाने की अनुमति देता है:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
परिणाम:
{"a":[5,6,7]}
किसी सरणी के अंत में मान जोड़ें
किसी सरणी के अंत में मानों को जोड़ने के लिए, हम json_insert()
. का उपयोग कर सकते हैं या json_set()
कार्य।
हालांकि, अगर हमें json_replace()
का उपयोग करना चाहिए , हम पूरे सरणी को दूसरे के साथ बदल सकते हैं जिसमें सरणी के अंत में अतिरिक्त मान जोड़ा गया है:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
परिणाम:
[1,2,3,4]
लेकिन जैसा कि बताया गया है, json_insert()
और json_set()
आपको वास्तव में संपूर्ण सरणी को बदले बिना सरणी में मान जोड़ने की अनुमति देता है।
सरणी तत्वों को बदलें
यहां json_replace()
का उपयोग करने का एक उदाहरण दिया गया है किसी ऐरे में किसी एलीमेंट को बदलने के लिए:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
परिणाम:
[1,4,3]
सरणियाँ शून्य आधारित हैं, और इसलिए [1]
दूसरे सरणी आइटम को इंगित करता है।
json_set()
फ़ंक्शन का उपयोग मौजूदा तत्वों को बदलने के लिए भी किया जा सकता है। हालांकि, json_insert()
फ़ंक्शन हमें मौजूदा तत्वों को बदलने की अनुमति नहीं देता है।
अमान्य पथ
यदि हमारा पथ ठीक से नहीं बना है तो हमें एक त्रुटि मिलेगी:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
परिणाम:
Runtime error: JSON path error near 'a'
इस मामले में, मैं $.
. शामिल करना भूल गया रास्ते के सामने।
अमान्य JSON दस्तावेज़
हमें एक त्रुटि भी मिलेगी जो JSON अच्छी तरह से गठित नहीं है:
SELECT json_replace('{ "a" : 1', '$.a', 2);
परिणाम:
Runtime error: malformed JSON
इस बार त्रुटि हमें बताती है कि हमारा JSON विकृत है।