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

时间:2018-11-22 14:39:52

标签: mysql json

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

{"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})应保持不变

3 个答案:

答案 0 :(得分:7)

没有简单的JSON函数可以执行相同的操作。我们可以结合使用一些JSON函数。

我们将使用Json_Remove()函数删除 oldKey-oldValue 对,然后Json_Insert()删除 newKey-oldValue 对。

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

bold

Demo

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文档中给定键对应的值。

->

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:0)

仅当JSON以缩小/紧凑格式存储且其中没有多余空格时,纯文本搜索和替换才有效。