Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL JSON menggabungkan dua kunci utama objek json dalam dokumen JSON

Berikut adalah cara yang sangat berbelit-belit untuk melakukan ini di MySQL, menggunakan JSON_TABLE untuk mengonversi pembaruan dan nilai JSON asli menjadi kolom, menggabungkan kolom menggunakan FULL JOIN (simulasi) dan kemudian membuat ulang nilai JSON keluaran menggunakan JSON_OBJECT dan JSON_ARRAYAGG ; akhirnya menggunakannya untuk memperbarui tabel asli:

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

Keluaran:

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

Demo di dbfiddle

Perhatikan ini mengasumsikan Anda menggunakan id yang unik nilai untuk membedakan baris di tabel Anda. Jika Anda menggunakan sesuatu yang lain, Anda perlu menukarnya di mana id digunakan dalam kueri di atas.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah database yang berbeda menggunakan kutipan nama yang berbeda?

  2. Cara mencari kata yang sama persis menggunakan MySql Query

  3. Campuran ilegal dari kesalahan collations dari MySql saat menjalankan rails test suite

  4. mysqli_stmt::bind_result():Jumlah variabel ikat tidak cocok dengan jumlah bidang dalam pernyataan yang disiapkan

  5. Bagaimana cara menemukan dan mengganti dalam CSV yang saya impor menggunakan mysql