Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL JSON обединява първичния ключ на два json обекта в JSON документ

Ето един безумно сложен начин да направите това в MySQL, като използвате JSON_TABLE за преобразуване на актуализацията и оригиналните JSON стойности в колони, като обедините колоните с помощта на (симулирано) FULL JOIN и след това повторно създаване на изходната JSON стойност с помощта на 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. Избиране на различни стойности от множество колони на таблица с техния брой

  2. Изисква се единична заявка за извличане на данни от таблици

  3. Mysql - намерете таблица в цялата база данни

  4. Съхранената процедура в MySQL е причинила „Командите не са синхронизирани“.

  5. С MySQL, как мога да генерирам колона, съдържаща индекса на записа в таблица?