Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL JSON łączy dwa klucze podstawowe obiektów json w dokumencie JSON

Oto szalenie zawiły sposób na zrobienie tego w MySQL, używając JSON_TABLE aby przekonwertować aktualizację i oryginalne wartości JSON na kolumny, scalając kolumny za pomocą (symulowanego) FULL JOIN a następnie ponowne utworzenie wyjściowej wartości JSON przy użyciu JSON_OBJECT i JSON_ARRAYAGG ; w końcu używając tego do aktualizacji oryginalnej tabeli:

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

Wyjście:

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

Demo na dbfiddle

Zauważ, że zakłada się, że używasz unikalnego id wartość, aby odróżnić wiersze w tabeli. Jeśli używasz czegoś innego, musisz to zamienić w miejscu id jest używany w powyższym zapytaniu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj MySQL z lewym złączem

  2. Nie zezwalaj na odwrócony złożony klucz podstawowy w MySQL

  3. Jak uzyskać jeden zestaw danych z zapytania SQL z wielu tabel?

  4. Wybieranie z tej samej tabeli więcej niż raz w tym samym zapytaniu

  5. odmowa dostępu dla użytkownika root @ localhost