दोनों समस्याओं के लिए (संशोधित) JSON तत्वों को वापस करने और एकत्र करने की आवश्यकता होती है। दोनों समस्याओं के लिए मैं इसे उपयोग में आसान बनाने के लिए एक फ़ंक्शन बनाऊंगा।
create function remove_element(p_value jsonb, p_to_remove jsonb)
returns jsonb
as
$$
select jsonb_agg(t.element order by t.idx)
from jsonb_array_elements(p_value) with ordinality as t(element, idx)
where not t.element @> p_to_remove;
$$
language sql
immutable;
फ़ंक्शन का उपयोग इस तरह किया जा सकता है, उदा। अद्यतन विवरण में:
update the_table
set the_column = remove_element(the_column, '{"ModuleId": 1}')
where ...
दूसरी समस्या के लिए एक समान कार्य काम आता है।
create function change_value(p_value jsonb, p_what jsonb, p_new jsonb)
returns jsonb
as
$$
select jsonb_agg(
case
when t.element @> p_what then t.element||p_new
else t.element
end order by t.idx)
from jsonb_array_elements(p_value) with ordinality as t(element, idx);
$$
language sql
immutable;
||
ऑपरेटर एक मौजूदा कुंजी को अधिलेखित कर देगा, इसलिए यह पुराने नाम को प्रभावी रूप से नए नाम से बदल देता है।
आप इसे इस तरह इस्तेमाल कर सकते हैं:
update the_table
set the_column = change_value(the_column, '{"ModuleId": 1}', '{"ModuleName": "CBA"}')
where ...;
मुझे लगता है कि JSON मानों को पास करना थोड़ा अधिक लचीला है, फिर कुंजियों को हार्डकोड करना जो फ़ंक्शन के उपयोग को बहुत सीमित कर देता है। पहले फ़ंक्शन का उपयोग एकाधिक कुंजियों की तुलना करके सरणी तत्वों को निकालने के लिए भी किया जा सकता है।
यदि आप फ़ंक्शन नहीं बनाना चाहते हैं, तो फ़ंक्शन कॉल को select
. से बदलें कार्यों से।