PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL:JSON कॉलम से विशेषता हटाएं

अपडेट करें :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');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पोस्टग्रेएसक्यूएल सर्वर शेर पर बंद नहीं होगा (मैक ओएस 10.7)

  2. डेबियन/उबंटू पर एक पोस्टग्रेएसक्यूएल प्रतिकृति सेटअप बनाना

  3. MSSQL से PostgreSQL में माइग्रेट करना - आपको क्या पता होना चाहिए

  4. टेबल को पोस्टग्रेज करने के लिए डेटाफ्रेम कैसे लिखें?

  5. आईडी के साथ रिकॉर्ड खोजने के लिए SQL क्वेरी किसी अन्य तालिका में नहीं है