我将这个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}
)应保持不变
答案 0 :(得分:7)
没有简单的JSON函数可以执行相同的操作。我们可以结合使用一些JSON函数。
我们将使用Json_Remove()
函数删除 oldKey-oldValue 对,然后Json_Insert()
删除 newKey-oldValue 对。
Json_Extract()
函数用于获取与JSON文档中的输入键相对应的值。
bold
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以缩小/紧凑格式存储且其中没有多余空格时,纯文本搜索和替换才有效。