mysql更新或重命名json中的密钥

2uluyalo  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(269)

我把这个json存储在db中

{
    "endDate": "2018-10-10",
    "startDate": "2017-09-05", 
    "oldKeyValue": {
        "foo": 1000, 
        "bar": 2000, 
        "baz": 3000
    },
    "anotherValue": 0
}

如何重命名 "oldKeyValue" 关键 "newKeyValue" 不知道 UPDATE 询问?我在找这样的东西

UPDATE `my_table` SET `my_col` = JSON()

注:只需更改键,值(即。 {"foo": 1000, "bar": 2000, "baz": 3000} )应该保持不变

qxsslcnc

qxsslcnc1#

没有简单的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')
                          );

演示

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;

结果

| @new_col                                                                                                                        |
| ------------------------------------------------------------------------------------------------------------------------------- |
| {"endDate": "2018-10-10", "startDate": "2017-09-05", "newKeyValue": {"bar": 2000, "baz": 3000, "foo": 1000}, "anotherValue": 0} |

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

UPDATE `my_table` 
SET `my_col` = JSON_INSERT(
                           JSON_REMOVE(my_col, '$.oldKeyValue'), 
                           '$.newKeyValue', 
                           my_col->'$.oldKeyValue' 
                          );
jtw3ybtb

jtw3ybtb2#

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

UPDATE my_table SET my_col = REPLACE(my_col, '"oldKeyValue":', '"newKeyValue":')

这将直接替换json字符串中的键名,而不破坏json结构。
我正在使用附加的 : 以避免无意中替换某个值。

siv3szwd

siv3szwd3#

纯文本搜索和替换只有在json以精简/紧凑格式存储且没有额外空格时才起作用。

相关问题