MySQL の JSON_SET関数

PostgreSQL JSON_SET/JSONB_SET と同じ要領で使うと失敗する。
  JSON_SET(json_doc, path, val[, path, val] ...)

  • path の指定は、JSONルートの $ から、区切り文字 '.' ピリオドで指定する。
  • PostgreSQL のようにキーが存在しなかったらセットする/しないの
    true/false 指定はなく存在しない場合は挿入、存在すれば更新である。

次のようにPostgreSQL と同様に path を指定してしまうと、

SET @j = '{"title": "Alpha", "other": {"label": "Abc", "width": 23} }';
SELECT json_set(@j, 'other,width', 80)

Error Code: 3143. Invalid JSON path expression
となる。
正しくは、、

SET @j = '{"title": "Alpha", "other": {"label": "Abc", "width": 23} }';
SELECT json_set(@j, '$.other.width', 80)

配列の更新は、[ index ] で、

SET @j = '{"title": "Alpha", "other": {"label": "Abc", "width": 90, "options":[ "X", "B", "C"  ]} }';
SELECT json_set(@j, '$.other.options[1]', 'a')
{"other": {"label": "Abc", "width": 90, "options": ["X", "a", "C"]}, "title": "Alpha"}

null をセットする時、PostgreSQL のケースとは異なって、、
json_set/jsonb_set で NULL をセットする時の注意 - Oboe吹きプログラマの黙示録
直接、null を指定して実行する。

SET @j = '{"title": "Alpha", "other": {"label": "Abc", "width": 23} }';
SELECT json_set(@j, '$.other.width', null)
{"other": {"label": "Abc", "width": null}, "title": "Alpha"}