mysql-遍历所有行并更新json数组中的所有对象
对于mysql 5.7,我有一个表mysql-遍历所有行并更新json数组中的所有对象,mysql,json,loops,Mysql,Json,Loops,对于mysql 5.7,我有一个表copy\u jobs,其中一列为json类型job\u configs job\u configs有一个属性configurations,它是一个对象数组 作业配置中的数据示例: {“配置”:[ { “角色”:“介绍”、“角色id”:1、“员工id”:1, “首次付款”:“15.63”,“第二次付款”:“46.88”, “员工编号”:“00001”,“员工姓氏”:“门德斯”, “首次付款”:假,“员工姓名”:“马里奥”, “第二次付款”:错误,“总奖金百分比”
copy\u jobs
,其中一列为json类型job\u configs
job\u configs
有一个属性configurations
,它是一个对象数组
作业配置中的数据示例
:
{“配置”:[
{
“角色”:“介绍”、“角色id”:1、“员工id”:1,
“首次付款”:“15.63”,“第二次付款”:“46.88”,
“员工编号”:“00001”,“员工姓氏”:“门德斯”,
“首次付款”:假,“员工姓名”:“马里奥”,
“第二次付款”:错误,“总奖金百分比”:25
}, {
“角色”:“P&D”,“角色id”:2,“员工id”:2,
“首次付款”:“12.50”,“第二次付款”:“37.50”,
“员工编号”:“00002”,“员工姓氏”:“帕克”,
“首次付款”:假,“员工姓名”:“Shaun”,
“第二次付款”:错误,“总奖金百分比”:20
}
]}
我需要运行一个迁移,将属性“fumbled”:false
和fumblesCaught:[]
添加到此表每行的配置
数组中的每个对象
我以为
UPDATE copy_jobs
SET job_configs = JSON_SET(job_configs, '$.configurations[*].fumbled', false);
至少可以添加“fumbled”:false,但会返回错误消息:在这种情况下,路径表达式可能不包含*和**标记。
是否有一种方法可以运行一个命令,在该命令中,它将向配置
数组中的每个对象添加两个新属性
或者我需要创建一个我可以调用的过程,该过程将通过配置
对象获取所有行和每行循环,并逐个向对象添加两个新属性
编辑:
在@wchiquito的评论之后,我创建了一个程序,认为这会起作用
CREATE PROCEDURE updateRoleConfig()
BEGIN
DECLARE counter Int DEFAULT 0;
DECLARE totalRows Int;
SELECT COUNT(*) INTO totalRows FROM copy_jobs;
SET totalRows = totalRows + 1;
WHILE counter < totalRows DO
SET @offset = counter;
PREPARE getRowSql FROM 'SELECT job_configs INTO @jsonConfigs FROM copy_jobs LIMIT 1 OFFSET ?';
EXECUTE getRowSql USING @offset;
SELECT concat('selected row is ', @jsonConfigs);
UPDATE copy_jobs SET job_configs = JSON_SET(job_configs, '$.configurations', CAST(
REPLACE(
JSON_EXTRACT(@jsonConfigs, '$.configurations'),
'}',
', "fumbled": false, "fumblesCaught": []}') AS JSON
)
);
SET counter = counter + 1;
END WHILE;
END
为什么会发生这种情况?我最终通过将ID存储在变量中,然后用该ID更新和获取json来让它工作
DELIMITER //
CREATE PROCEDURE updateRoleConfig()
BEGIN
DECLARE counter Int DEFAULT 0;
DECLARE totalRows Int;
SELECT COUNT(*) FROM copy_jobs INTO totalRows;
SET totalRows = totalRows + 1;
SET counter = 0;
WHILE counter < totalRows DO
SET @offset = counter;
SELECT concat('offset is ', @offset);
SELECT concat('counter is ', counter);
PREPARE getIdSql FROM 'SELECT id FROM copy_jobs LIMIT 1 OFFSET ? INTO @rowId';
EXECUTE getIdSql USING @offset;
PREPARE getJsonSql FROM 'SELECT job_configs FROM copy_jobs WHERE id=? INTO @jsonConfigs';
EXECUTE getJsonSql USING @rowId;
SELECT concat('selected row is ', @jsonConfigs);
SELECT concat('selected row id ', @rowId);
SET @json = JSON_SET(@jsonConfigs, '$.configurations', CAST(
REPLACE(
JSON_EXTRACT(@jsonConfigs, '$.configurations'),
'}',
', "fumbled": false, "fumblesCaught": []}') AS JSON
)
);
UPDATE copy_jobs SET job_configs = @json WHERE id = @rowId;
SET counter = counter + 1;
END WHILE;
END//
DELIMITER ;
分隔符//
创建过程updateRoleConfig()
开始
声明计数器Int默认值为0;
声明totalRows Int;
从复制作业到总计行中选择计数(*);
设置totalRows=totalRows+1;
设置计数器=0;
而计数器行是
设置@offset=计数器;
选择concat('offset is',@offset);
选择concat(“计数器为”,计数器);
从“从复制作业中选择id限制1偏移量”准备getIdSql?进入@rowId';
使用@offset执行getIdSql;
从“选择作业”准备getJsonSql,从复制作业配置,其中id=?进入@jsonConfigs';
使用@rowId执行getJsonSql;
选择concat('selected row is',@jsonConfigs);
选择concat('selected row id',@rowId);
SET@json=json\u SET(@jsonconfig,'$.configurations',CAST(
替换(
JSON_EXTRACT(@jsonconfig,'$.configurations'),
'}',
“,“fumbled”:false,“fumblesCaught”:[]}”)作为JSON
)
);
更新copy_jobs SET job_configs=@json,其中id=@rowId;
设置计数器=计数器+1;
结束时;
结束//
定界符;
试试一个基本的想法。@wchiquito我看了你的小提琴后更新了我的问题。仍然有问题您真的需要存储过程吗?试试。@wchiquito我实际上没有试过!很高兴您花时间向我展示了它在一个查询中是有效的。谢谢你应该把它作为答案贴出来,这样我就可以投票了!