jsonb_set()
का तीसरा तर्क jsonb
. का होना चाहिए प्रकार। समस्या एक पाठ स्ट्रिंग को jsonb स्ट्रिंग में कास्ट करने में है, आपको दोहरे उद्धरण चिह्नों में एक स्ट्रिंग की आवश्यकता है। आप concat()
. का उपयोग कर सकते हैं या format()
:
update animal
set info =
jsonb_set(info, '{location}', concat('"', lower(info->>'location'), '"')::jsonb, true)
-- jsonb_set(info, '{location}', format('"%s"', lower(info->>'location'))::jsonb, true)
where id='49493'
returning *;
id | info
-------+------------------------------------------------------------------
49493 | {"habit1": "fly", "habit2": "dive", "location": "sonoma narite"}
(1 row)
पोस्टग्रेज 9.4 . में आपको jsonb_each_text() का उपयोग करके json कॉलम को अननेस्ट करना चाहिए, फ्लाई पर उचित मान को संशोधित करने वाली कुल कुंजी और मान, और अंत में एक जेसन ऑब्जेक्ट बनाना चाहिए:
update animal a
set info = u.info
from (
select id, json_object(
array_agg(key),
array_agg(
case key when 'location' then lower(value)
else value end))::jsonb as info
from animal,
lateral jsonb_each_text(info)
group by 1
) u
where u.id = a.id
and a.id = 49493;
यदि आप फ़ंक्शन बना सकते हैं तो यह समाधान अधिक सुखद हो सकता है:
create or replace function update_info(info jsonb)
returns jsonb language sql as $$
select json_object(
array_agg(key),
array_agg(
case key when 'location' then lower(value)
else value end))::jsonb
from jsonb_each_text(info)
$$
update animal
set info = update_info(info)
where id = 49493;