अपडेट करें :9.5+ के लिए, ऐसे स्पष्ट ऑपरेटर हैं जिनका उपयोग आप jsonb
. के साथ कर सकते हैं (यदि आपके पास json
. है टाइप किया गया कॉलम, आप संशोधन लागू करने के लिए कास्ट का उपयोग कर सकते हैं):
किसी 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 स्ट्रिंग को एकत्रित करने के बजाय, आप एक json
में एकत्रित कर सकते हैं सीधे json_object_agg()
के साथ ऑब्जेक्ट करें ।
संबंधित:PostgreSQL के भीतर अन्य JSON जोड़तोड़:
- मैं नए PostgreSQL JSON डेटाटाइप के अंदर फ़ील्ड्स को कैसे संशोधित करूं?
मूल उत्तर (पोस्टग्रेएसक्यूएल 9.3 पर लागू होता है):
यदि आपके पास कम से कम PostgreSQL 9.3 है, तो आप अपनी वस्तु को json_each()
के साथ जोड़े में विभाजित कर सकते हैं और अपने अवांछित क्षेत्रों को फ़िल्टर करें, फिर मैन्युअल रूप से जेसन को फिर से बनाएं। कुछ इस तरह:
SELECT data::text::json AS before,
('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text
9.2 (या कम) के साथ यह संभव नहीं है।
संपादित करें :
एक अधिक सुविधाजनक रूप एक फ़ंक्शन बनाना है, जो json
. में किसी भी संख्या में विशेषताओं को हटा सकता है फ़ील्ड:
2 संपादित करें :string_agg()
array_to_string(array_agg())
. से कम खर्चीला है
CREATE OR REPLACE FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])
RETURNS json
LANGUAGE sql
IMMUTABLE
STRICT
AS $function$
SELECT COALESCE(
(SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
FROM json_each("json")
WHERE "key" <> ALL ("keys_to_delete")),
'{}'
)::json
$function$;
इस फ़ंक्शन के साथ, आपको केवल नीचे दी गई क्वेरी को चलाने की आवश्यकता है:
UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');