আপডেট : পোস্টগ্রেএসকিউএল 9.5 এর সাথে পোস্টগ্র্রেএসকিউএলjsonb
নিজেই কিছু হেরফের কার্যকারিতা রয়েছে (তবে এর জন্য কিছুই নয় json
; বর্ণকে json
মানগুলি হস্তান্তর করার প্রয়োজন হয় না )।
2 (বা আরও) জেএসওএন অবজেক্টগুলিকে মার্জ করা (বা কনটেনেটিং অ্যারে):
SELECT jsonb '{"a":1}' || jsonb '{"b":2}', -- will yield jsonb '{"a":1,"b":2}'
jsonb '["a",1]' || jsonb '["b",2]' -- will yield jsonb '["a",1,"b",2]'
সুতরাং, একটি সাধারণ কী নির্ধারণ করে ব্যবহার করা যেতে পারে:
SELECT jsonb '{"a":1}' || jsonb_build_object('<key>', '<value>')
<key>
স্ট্রিংটি কোথায় হওয়া উচিত এবং <value>
যে কোনও ধরণের to_jsonb()
গ্রহণযোগ্য হতে পারে ।
একটি JSON শ্রেণিবিন্যাসের গভীরতম মান নির্ধারণের জন্য , jsonb_set()
ফাংশনটি ব্যবহার করা যেতে পারে:
SELECT jsonb_set('{"a":[null,{"b":[]}]}', '{a,1,b,0}', jsonb '{"c":3}')
-- will yield jsonb '{"a":[null,{"b":[{"c":3}]}]}'
সম্পূর্ণ পরামিতি তালিকা jsonb_set()
:
jsonb_set(target jsonb,
path text[],
new_value jsonb,
create_missing boolean default true)
path
JSON অ্যারে সূচকগুলিও খুব বেশি থাকতে পারে এবং নেতিবাচক পূর্ণসংখ্যার উপস্থিতিগুলি JSON অ্যারেগুলির শেষে থেকে গণনা করা হয়। তবে একটি অস্তিত্বহীন, তবে ইতিবাচক জেএসওএন অ্যারে সূচক উপাদানটিকে অ্যারের শেষে যুক্ত করবে:
SELECT jsonb_set('{"a":[null,{"b":[1,2]}]}', '{a,1,b,1000}', jsonb '3', true)
-- will yield jsonb '{"a":[null,{"b":[1,2,3]}]}'
জন্য তাদেরকে JSON অ্যারের মধ্যে ঢোকাতে (মূল মূল্যবোধের সব সংরক্ষণের সময়) , jsonb_insert()
(ফাংশন ব্যবহার করা যেতে পারে 9.6+ মধ্যে; শুধুমাত্র এই বিভাগে এই ফাংশন, ):
SELECT jsonb_insert('{"a":[null,{"b":[1]}]}', '{a,1,b,0}', jsonb '2')
-- will yield jsonb '{"a":[null,{"b":[2,1]}]}', and
SELECT jsonb_insert('{"a":[null,{"b":[1]}]}', '{a,1,b,0}', jsonb '2', true)
-- will yield jsonb '{"a":[null,{"b":[1,2]}]}'
সম্পূর্ণ পরামিতি তালিকা jsonb_insert()
:
jsonb_insert(target jsonb,
path text[],
new_value jsonb,
insert_after boolean default false)
আবার, নেতিবাচক পূর্ণসংখ্যাগুলি যা path
JSON অ্যারেগুলির শেষে থেকে গণনাতে উপস্থিত হয় ।
সুতরাং, f.ex. একটি JSON অ্যারে শেষ সংযোজন এর মাধ্যমে করা যেতে পারে:
SELECT jsonb_insert('{"a":[null,{"b":[1,2]}]}', '{a,1,b,-1}', jsonb '3', true)
-- will yield jsonb '{"a":[null,{"b":[1,2,3]}]}', and
যাইহোক, এই ফাংশন সামান্য ভিন্নভাবে (তুলনায় কাজ করছে jsonb_set()
) যখন path
মধ্যে target
একটি JSON- বস্তুর চাবিকাঠি। সেক্ষেত্রে, কীটি ব্যবহার না করা হলে এটি কেবল JSON অবজেক্টের জন্য একটি নতুন কী-মান জুটি যুক্ত করবে। যদি এটি ব্যবহার করা হয় তবে এটি একটি ত্রুটি বাড়িয়ে তুলবে:
SELECT jsonb_insert('{"a":[null,{"b":[1]}]}', '{a,1,c}', jsonb '[2]')
-- will yield jsonb '{"a":[null,{"b":[1],"c":[2]}]}', but
SELECT jsonb_insert('{"a":[null,{"b":[1]}]}', '{a,1,b}', jsonb '[2]')
-- will raise SQLSTATE 22023 (invalid_parameter_value): cannot replace existing key
একটি JSON অবজেক্ট (বা একটি অ্যারে থেকে ) থেকে একটি কী (বা একটি সূচক) মুছে ফেলা-
অপারেটরের মাধ্যমে করা যেতে পারে :
SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
jsonb '["a",1,"b",2]' - 1 -- will yield jsonb '["a","b",2]'
একটি JSON- শ্রেণীবিন্যাসে গভীর থেকে মুছে ফেলা হচ্ছে সঙ্গে কাজ করা যেতে পারে #-
অপারেটর:
SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'
9.4-র জন্য , আপনি মূল উত্তরের (নীচে) একটি সংশোধিত সংস্করণ ব্যবহার করতে পারেন, তবে কোনও জেএসএন স্ট্রিংকে একত্রিত করার পরিবর্তে আপনি সরাসরি একটি জসন অবজেক্টে একত্রিত করতে পারেন json_object_agg()
।
মূল উত্তর : খাঁটি এসকিউএলে এটিও সম্ভব (পলপিথন বা plv8 ছাড়াই) সম্ভব (তবে 9.3+ প্রয়োজন, 9.2 দিয়ে কাজ করবে না)
CREATE OR REPLACE FUNCTION "json_object_set_key"(
"json" json,
"key_to_set" TEXT,
"value_to_set" anyelement
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT concat('{', string_agg(to_json("key") || ':' || "value", ','), '}')::json
FROM (SELECT *
FROM json_each("json")
WHERE "key" <> "key_to_set"
UNION ALL
SELECT "key_to_set", to_json("value_to_set")) AS "fields"
$function$;
SQLFiddle
সম্পাদনা করুন :
একটি সংস্করণ, যা একাধিক কী এবং মান সেট করে:
CREATE OR REPLACE FUNCTION "json_object_set_keys"(
"json" json,
"keys_to_set" TEXT[],
"values_to_set" anyarray
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT concat('{', string_agg(to_json("key") || ':' || "value", ','), '}')::json
FROM (SELECT *
FROM json_each("json")
WHERE "key" <> ALL ("keys_to_set")
UNION ALL
SELECT DISTINCT ON ("keys_to_set"["index"])
"keys_to_set"["index"],
CASE
WHEN "values_to_set"["index"] IS NULL THEN 'null'::json
ELSE to_json("values_to_set"["index"])
END
FROM generate_subscripts("keys_to_set", 1) AS "keys"("index")
JOIN generate_subscripts("values_to_set", 1) AS "values"("index")
USING ("index")) AS "fields"
$function$;
2 সম্পাদনা করুন : @ এরউইন ব্র্যান্ডস্টেটর উপরে উল্লিখিত এই ফাংশনগুলিকে তথাকথিত হিসাবে কাজ করেছে UPSERT
(একটি ক্ষেত্র যদি এটি উপস্থিত থাকে তবে এটি উপস্থিত না থাকলে সন্নিবেশ করায় আপডেট করে) noted এখানে একটি বৈকল্পিক রয়েছে যা কেবলমাত্র UPDATE
:
CREATE OR REPLACE FUNCTION "json_object_update_key"(
"json" json,
"key_to_set" TEXT,
"value_to_set" anyelement
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT CASE
WHEN ("json" -> "key_to_set") IS NULL THEN "json"
ELSE (SELECT concat('{', string_agg(to_json("key") || ':' || "value", ','), '}')
FROM (SELECT *
FROM json_each("json")
WHERE "key" <> "key_to_set"
UNION ALL
SELECT "key_to_set", to_json("value_to_set")) AS "fields")::json
END
$function$;
3 সম্পাদনা করুন : এখানে পুনরাবৃত্তিমূলক বৈকল্পিক রয়েছে, যা UPSERT
একটি কী-পাথ (যেখানে কীগুলি কেবল অভ্যন্তরীণ বস্তুগুলিকে বোঝাতে পারে, অভ্যন্তরীণ অ্যারে সমর্থিত নয়) অবস্থিত একটি পাতার মান নির্ধারণ করতে পারে (এবং এই উত্তর থেকে প্রথম ফাংশন ব্যবহার করে):
CREATE OR REPLACE FUNCTION "json_object_set_path"(
"json" json,
"key_path" TEXT[],
"value_to_set" anyelement
)
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT CASE COALESCE(array_length("key_path", 1), 0)
WHEN 0 THEN to_json("value_to_set")
WHEN 1 THEN "json_object_set_key"("json", "key_path"[l], "value_to_set")
ELSE "json_object_set_key"(
"json",
"key_path"[l],
"json_object_set_path"(
COALESCE(NULLIF(("json" -> "key_path"[l])::text, 'null'), '{}')::json,
"key_path"[l+1:u],
"value_to_set"
)
)
END
FROM array_lower("key_path", 1) l,
array_upper("key_path", 1) u
$function$;
আপডেট : ফাংশন এখন সংক্ষিপ্ত করা হয়।
select json_object_set_key((select data from test where data->>'b' = '2'), 'b', 'two');
ত্রুটি বার্তাটি চেষ্টা করার সময় একটি ত্রুটি দেখছিERROR: could not determine polymorphic type because input has type "unknown"