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

MySQL JSON JSON दस्तावेज़ में दो json ऑब्जेक्ट प्राथमिक कुंजी को मर्ज करता है

यहां JSON_TABLE अपडेट और मूल JSON मानों को कॉलम में बदलने के लिए, एक (सिम्युलेटेड) FULL JOIN का उपयोग करके कॉलम को मर्ज करना और फिर JSON_OBJECT और JSON_ARRAYAGG कोड> ; अंत में मूल तालिका को अपडेट करने के लिए इसका उपयोग करना:

WITH upd AS (
  SELECT *
  FROM JSON_TABLE('[{"substanceId": 182, "text": "substance_name_182_new"}, {"substanceId": 184, "text": "substance_name_184"}]',
                  '$[*]' COLUMNS (
                  substanceId INT PATH '$.substanceId',
                  txt VARCHAR (100) PATH '$.text')
                  ) jt
  CROSS JOIN (SELECT DISTINCT id
              FROM test) t
),
cur AS (
  SELECT id, substanceId, txt
  FROM test
  JOIN JSON_TABLE(test.j,
                  '$[*]' COLUMNS (
                  substanceId INT PATH '$.substanceId',
                  txt VARCHAR (100) PATH '$.text')
                 ) jt
),
allv AS (
  SELECT COALESCE(upd.id, cur.id) AS id, 
         COALESCE(upd.substanceId, cur.substanceId) AS substanceId,
         COALESCE(upd.txt, cur.txt) AS txt
  FROM upd
  LEFT JOIN cur ON cur.substanceId = upd.substanceId
  UNION ALL 
  SELECT COALESCE(upd.id, cur.id) AS id, 
         COALESCE(upd.substanceId, cur.substanceId) AS substanceId,
         COALESCE(upd.txt, cur.txt) AS txt
  FROM upd
  RIGHT JOIN cur ON cur.substanceId = upd.substanceId
),
obj AS (
  SELECT DISTINCT id, JSON_OBJECT('substanceId', substanceId, 'text', txt) AS o
  FROM allv
),
arr AS (
  SELECT id, JSON_ARRAYAGG(o) AS a
  FROM obj
  GROUP BY id
)
UPDATE test
JOIN arr ON test.id = arr.id
SET test.j = arr.a
;
SELECT JSON_PRETTY(j)
FROM test

आउटपुट:

[
  {
    "text": "substance_name_183",
    "substanceId": 183
  },
  {
    "text": "substance_name_184",
    "substanceId": 184
  },
  {
    "text": "substance_name_182_new",
    "substanceId": 182
  }
]

dbfiddle पर डेमो

ध्यान दें कि यह माना जाता है कि आप एक अद्वितीय id का उपयोग करते हैं अपनी तालिका में पंक्तियों को अलग करने के लिए मूल्य। यदि आप कुछ और उपयोग करते हैं, तो आपको उसे स्वैप करना होगा जहां id उपरोक्त क्वेरी में प्रयोग किया जाता है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जहां स्थिति में mysql कॉलम द्वारा समूह का उपयोग करता है

  2. 2038-01-19 के बाद MySQL from_unixtime?

  3. बंद करने और फिर से खोलने के बाद HTML फॉर्म भरना जारी रखें

  4. कमांड लाइन से एक mysql डेटाबेस को प्लेनटेक्स्ट (CSV) बैकअप में डंप करें

  5. Zend/PHP:MySQL के BLOB फ़ील्ड में/से फ़ाइल अपलोड/डाउनलोड करने में समस्या