MariaDB 在 JSON 中跨数组更新 json 属性
MariaDB updating json attribute across array in JSON
Goal
I have a json column in my table which I want to update in MariaDB 10.3.18.
CREATE TABLE IF NOT EXISTS `json_data` (
`name` VARCHAR(255),
`config_json` MEDIUMTEXT(10000)
);
config_json 字段具有这样的值。
{
"one": {
"filters": [
{
"type": "campaign_categories_5",
"title": "Title1"
}
],
"value1": "one",
"containers": [],
"combined": false
},
"description": "",
"columns": [
{
"dataType": "STRING",
"title": "Title1"
},
{
"dataType": "STRING",
"title": "Title2"
},
{
"dataType": "STRING",
"title": "Title3"
},
{
"dataType": "STRING",
"title": "Title1"
}
]
}
我正在尝试通过将路径 column[*].title
中 config_json 的属性 "title" 替换为值 "Title1" 来更新 table 中的每个条目"Updated Title1"、"Title2" 与 "Updated Title2" 和 "Title3" 与 "Updated Title3"。
更新后的 json 应该是这样的
{
"one": {
"filters": [
{
"type": "campaign_categories_5",
"title": "Title1"
}
],
"value1": "one",
"containers": [],
"combined": false
},
"description": "",
"columns": [
{
"dataType": "STRING",
"title": "Updated Title1"
},
{
"dataType": "STRING",
"title": "Updated Title2"
},
{
"dataType": "STRING",
"title": "Updated Title3"
},
{
"dataType": "STRING",
"title": "Updated Title1"
}
]
}
正如您在上面看到的,我不应该更改其他路径中的标题属性。
我正在尝试这个
drop FUNCTION if EXISTS modify_json;
create FUNCTION modify_json(myvar json)
returns json
deterministic
begin
SET @i = 0;
SET @len = JSON_LENGTH(myvar, '$.columns');
while i < @len do
IF JSON_CONTAINS(myvar, '"Title1"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title1"');
END IF;
IF JSON_CONTAINS(myvar, '"Title2"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title2"');
END IF;
IF JSON_CONTAINS(myvar, '"Title3"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title3"');
END IF;
set i = i + 1;
end while;
return myvar;
end;
update config_suite_reports_element set config_json = modify_json(config_json)
where json_contains_path(config_json, 'one', '$.columns[*].title');
但我收到以下错误
Error occurred during SQL script execution
Reason:
SQL Error [1064] [42000]: (conn=5434951) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 6
我发现了问题。
1.定界符
2. 最新mariaDB 10.3
变量命名规则
DROP FUNCTION IF EXISTS func;
DELIMITER //
CREATE FUNCTION func(myvar json) RETURNS json DETERMINISTIC
BEGIN
DECLARE i TINYINT;
DECLARE len TINYINT;
SET i = 0;
SET len = JSON_LENGTH(myvar, '$.columns');
while i < len do
IF JSON_CONTAINS(myvar, '"Title1"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title1');
ELSEIF JSON_CONTAINS(myvar, '"Title2"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title2');
ELSEIF JSON_CONTAINS(myvar, '"Title3"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title3');
END IF;
set i = i + 1;
end while;
RETURN myvar;
END
//
DELIMITER ;
谢谢@BillKarwin
Goal I have a json column in my table which I want to update in MariaDB 10.3.18.
CREATE TABLE IF NOT EXISTS `json_data` (
`name` VARCHAR(255),
`config_json` MEDIUMTEXT(10000)
);
config_json 字段具有这样的值。
{
"one": {
"filters": [
{
"type": "campaign_categories_5",
"title": "Title1"
}
],
"value1": "one",
"containers": [],
"combined": false
},
"description": "",
"columns": [
{
"dataType": "STRING",
"title": "Title1"
},
{
"dataType": "STRING",
"title": "Title2"
},
{
"dataType": "STRING",
"title": "Title3"
},
{
"dataType": "STRING",
"title": "Title1"
}
]
}
我正在尝试通过将路径 column[*].title
中 config_json 的属性 "title" 替换为值 "Title1" 来更新 table 中的每个条目"Updated Title1"、"Title2" 与 "Updated Title2" 和 "Title3" 与 "Updated Title3"。
更新后的 json 应该是这样的
{
"one": {
"filters": [
{
"type": "campaign_categories_5",
"title": "Title1"
}
],
"value1": "one",
"containers": [],
"combined": false
},
"description": "",
"columns": [
{
"dataType": "STRING",
"title": "Updated Title1"
},
{
"dataType": "STRING",
"title": "Updated Title2"
},
{
"dataType": "STRING",
"title": "Updated Title3"
},
{
"dataType": "STRING",
"title": "Updated Title1"
}
]
}
正如您在上面看到的,我不应该更改其他路径中的标题属性。 我正在尝试这个
drop FUNCTION if EXISTS modify_json;
create FUNCTION modify_json(myvar json)
returns json
deterministic
begin
SET @i = 0;
SET @len = JSON_LENGTH(myvar, '$.columns');
while i < @len do
IF JSON_CONTAINS(myvar, '"Title1"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title1"');
END IF;
IF JSON_CONTAINS(myvar, '"Title2"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title2"');
END IF;
IF JSON_CONTAINS(myvar, '"Title3"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), '"Updated Title3"');
END IF;
set i = i + 1;
end while;
return myvar;
end;
update config_suite_reports_element set config_json = modify_json(config_json)
where json_contains_path(config_json, 'one', '$.columns[*].title');
但我收到以下错误
Error occurred during SQL script execution
Reason:
SQL Error [1064] [42000]: (conn=5434951) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 6
我发现了问题。 1.定界符 2. 最新mariaDB 10.3
变量命名规则DROP FUNCTION IF EXISTS func;
DELIMITER //
CREATE FUNCTION func(myvar json) RETURNS json DETERMINISTIC
BEGIN
DECLARE i TINYINT;
DECLARE len TINYINT;
SET i = 0;
SET len = JSON_LENGTH(myvar, '$.columns');
while i < len do
IF JSON_CONTAINS(myvar, '"Title1"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title1');
ELSEIF JSON_CONTAINS(myvar, '"Title2"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title2');
ELSEIF JSON_CONTAINS(myvar, '"Title3"', concat('$.columns[', i, '].title')) THEN
set myvar = json_replace(myvar, concat('$.columns[', i, '].title'), 'Updated Title3');
END IF;
set i = i + 1;
end while;
RETURN myvar;
END
//
DELIMITER ;
谢谢@BillKarwin