mysql - 如何在mysql中替换JSON键的值
问题描述
我有一个 mysql JSON 列,例如:
column value
data [{ "report1": { "result": "5"}, "report2": {"result": "6"}, "report3": {"a": "4"}}, {"report1": { "result": "9"},"report4": {"details": "<b>We need to show the details here</b>"}, "report3": {"result": "5"}}]
另一个数据实例是:
[{ "report1": { "result": "5"}, "report2": {"result": "6"}, "report3": {"a": "4"}}, {"report1": { "result": "9"}, "report3": {"result": "5"},"report4": {"details": "<b>We need to show the details here</b>"}}]
在上面的记录中,键出现在第二个索引上。
在这个:
[{ "report1": { "result": "5"}, "report2": {"result": "6"}, "report3": {"a": "4"}}, {"report1": { "result": "9"}, "report3": {"result": "5"}}]
钥匙不存在。
我需要用 just 替换{"details": "<b>We need to show the details here</b>"}
,即 keyreport4
的值[]
,我现在需要此报告中的数据。
实际上,生成数据的逻辑已经从 XML 数据更改为 JSON 数据,仅针对该键,所以我们需要将其替换为一个空白数组,即现在的目标类型,而不影响其他数据。
有没有直接的解决方案?我避免在这里创建程序。
因此,目标数据将是:
[{ "report1": { "result": "5"}, "report2": {"result": "6"}, "report3": {"a": "4"}}, {"report1": { "result": "9"},"report4": [], "report3": {"result": "5"}}]
是的,JSON 中的密钥不一致,这意味着密钥可能存在next
或previous
记录在其中,table
但可能不存在于this
记录中。
解决方案
该列应该是JSON
有效使用 MySQL 的 JSON 功能的类型。然后使用JSON 修改函数,如JSON_REPLACE
.
由于每个值都包含一个 JSON 数组,其大小可能事先不知道,因此您可以创建一个小的实用函数来修改数组中的每个元素。
create function modify_json(val json)
returns json
deterministic
begin
declare len int default json_length(val);
declare i int default 0;
while i < len do
# Replace the report4 property of the i'th element with an empty list
set val = json_replace(val, concat('$[', i, '].report4'), '[]');
set i = i + 1;
end while;
return val;
end;
使用您的实用程序函数,更新记录:
update table set data = modify_json(data)
where json_contains_path(data, 'one', '$[*].report4');
report4
在这种情况下,将根据modify_json
函数更新包含至少一个具有属性的元素的记录。您可以使用多个更新命令来实现相同的目的,这些命令分别对 JSON 数组的每个索引进行操作。
如果由于某种原因列不能是 JSON 类型,那么您可以允许 MySQL 强制数据,或者您的程序可以将字符串编组为 JSON 对象,修改数据,然后将其序列化为字符串,并更新行.
推荐阅读
- git - 远程关闭heroku和github连接错误
- python - 正则表达式和 Python glob
- excel - 如何计算 Microsoft Excel 中的目标年数
- node.js - 异步/等待外部变量访问
- time-complexity - 评估二项式系数的时间复杂度
- javascript - 如何使我的复选框仅被单击一次,而在 React.js 中未选中其他复选框
- java - 使用扫描仪从文本文件中读取某一行
- javascript - React Hooks 与 Redux 保持 App 状态
- node.js - 将动态生成的图像提供给聊天机器人
- c# - 如何在 C# 中动态链接 Linq 方法?