Her er en sindssygt indviklet måde at gøre dette på i MySQL ved at bruge JSON_TABLE
for at konvertere opdateringen og de originale JSON-værdier til kolonner ved at flette kolonnerne ved hjælp af en (simuleret) FULD JOIN
og derefter genskabe output-JSON-værdien ved hjælp af JSON_OBJECT
og JSON_ARRAYAGG
; endelig ved at bruge det til at opdatere den originale tabel:
WITH upd AS ( SELECT * FROM JSON_TABLE('[{"substanceId":182, "text":"substance_name_182_new"}, {"substanceId":184, "text":"substance_name_184"}]' , '$[*]' KOLONNER ( stofId INT PATH '$.substanceId', txt VARCHAR (100) PATH '$.text') ) jt CROSS JOIN (SELECT DISTINCT id FROM test) t),cur AS ( SELECT id, substansId, txt FRA test JOIN JSON_TABLE(test.j, '$[*]' KOLUMNER (substansId 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 stofId, COALESCE(upd.txt, cur.txt) AS txt FRA 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 stofId, COALESCE(upd.txt, cur.txt) AS t xt FRA upd HØJRE JOIN cur ON cur.substanceId =upd.substanceId),obj AS ( SELECT DISTINCT id, JSON_OBJECT('substanceId', stofId, 'text', txt) AS o FROM allv),arr AS ( SELECT id, JSON_ARRAYAGG (o) SOM FRA obj GROUP BY id)OPDATERING testJOIN arr ON test.id =arr.idSET test.j =arr.a;SELECT JSON_PRETTY(j)FROM test
Output:
[ { "text":"substance_name_183", "substanceId":183 }, { "text":"substance_name_184", "substanceId":184 }, { "text":"substance_name_182_new", "substanceId" ":182 }]
Bemærk dette forudsætter, at du bruger et unikt id
værdi for at skelne rækkerne i din tabel. Hvis du bruger noget andet, skal du bytte det ud i hvor id
bruges i ovenstående forespørgsel.