MySQL更新或重命名JSON中的密钥

ltd*_*dev 7 mysql json

我将这个json存储在数据库中

{
    "endDate": "2018-10-10",
    "startDate": "2017-09-05", 
    "oldKeyValue": {
        "foo": 1000, 
        "bar": 2000, 
        "baz": 3000
    },
    "anotherValue": 0
}
Run Code Online (Sandbox Code Playgroud)

如何"oldKeyValue""newKeyValue"不知道UPDATE查询中键索引的情况下将键重命名为?我正在寻找这样的东西

UPDATE `my_table` SET `my_col` = JSON()
Run Code Online (Sandbox Code Playgroud)

注意:只有密钥需要更改,值(即{"foo": 1000, "bar": 2000, "baz": 3000})应保持不变

Al *_*ndy 12

我个人更喜欢另一种方法:

UPDATE my_table SET my_col = REPLACE(my_col, '"oldKeyValue":', '"newKeyValue":')
Run Code Online (Sandbox Code Playgroud)

这将直接替换JSON字符串中的键名,而不会破坏JSON结构。

我正在使用:附加值,以避免无意中替换值。

  • 如果 JSON 处于嵌套结构中,并且不同级别具有相同的键名称,则可能会无意中更改结构 (3认同)

Mad*_*iya 11

没有简单的JSON函数可以做到这一点。我们可以结合使用一些JSON函数。

我们将删除oldKey-属性oldValue通过对Json_Remove()功能,然后Json_Insert()则newkey-属性oldValue对。

Json_Extract() 函数用于获取与JSON文档中的输入键对应的值。

UPDATE `my_table` 
SET `my_col` = JSON_INSERT(
                           JSON_REMOVE(my_col, '$.oldKeyValue'), 
                           '$.newKeyValue', 
                           JSON_EXTRACT(my_col, '$.oldKeyValue')
                          );
Run Code Online (Sandbox Code Playgroud)

演示版

SET @my_col := '{"endDate": "2018-10-10", "startDate": "2017-09-05", "oldKeyValue": {"foo": 1000, "bar": 2000, "baz": 3000}, "anotherValue": 0}';

SET @new_col := JSON_INSERT(
                            JSON_REMOVE(@my_col, '$.oldKeyValue'), 
                            '$.newKeyValue',
                            JSON_EXTRACT(@my_col,'$.oldKeyValue')
                          );

SELECT @new_col;
Run Code Online (Sandbox Code Playgroud)

结果

| @new_col                                                                                                                        |
| ------------------------------------------------------------------------------------------------------------------------------- |
| {"endDate": "2018-10-10", "startDate": "2017-09-05", "newKeyValue": {"bar": 2000, "baz": 3000, "foo": 1000}, "anotherValue": 0} |
Run Code Online (Sandbox Code Playgroud)

作为替代Json_Extract(),我们还可以使用->运算符来访问与JSON文档中给定键对应的值。

UPDATE `my_table` 
SET `my_col` = JSON_INSERT(
                           JSON_REMOVE(my_col, '$.oldKeyValue'), 
                           '$.newKeyValue', 
                           my_col->'$.oldKeyValue' 
                          );
Run Code Online (Sandbox Code Playgroud)