sql >> データベース >  >> RDS >> Mysql

MySQL JSONは、JSONドキュメントの2つの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. MySql-主キーはデフォルトで一意ですか?

    2. n層アプリケーションのUTC日時値を設定する場所:プレゼンテーション層、ドメイン、またはデータベース?

    3. PDO ... SET NAMES utf8は危険ですか?

    4. mysql 5.7は、中程度のSQLではmysql5.6よりもはるかに低速です。