gpt4 book ai didi

MySQL 更新数组中的特定 JSON 对象

转载 作者:行者123 更新时间:2023-11-29 07:36:25 25 4
gpt4 key购买 nike

我正在努力寻找一种方法来更新 MySQL 中 JSON 类型字段中数组中的特定 JSON 对象。假设我有以下对象:

SET @j = '{
"cat": "meow",
"dog": "woof",
"parrot": [
{"volume": "quiet", "says": "hello"},
{"volume": "loud", "says": "polly"},
{"volume": "loud", "says": "cracker"}
]
}';

如何更新 parrot 数组中音量值为 loud 的所有对象?

我知道如果对象的位置已知,我可以使用 JSON_SET 或 JSON_REPLACE 函数来更改/更新特定对象。例如:

UPDATE T1 SET @J = JSON_SET(@j, '$.parrot[1].says', 'pretty bird');

但是我不知道对象的位置,而且这不会更新 parrot 数组中音量值为 loud 的所有对象吗?

有什么建议吗?

最佳答案

一个选项:

DROP PROCEDURE IF EXISTS `sp_update_json`;

DELIMITER //

CREATE PROCEDURE `sp_update_json`(
`json` JSON,
`value` VARCHAR(255)
)
BEGIN
DECLARE `array_objects` JSON DEFAULT
REPLACE(JSON_SEARCH(`json`,
'all',
'loud',
NULL,
'$.parrot[*].volume'
), 'volume', 'says');
DECLARE `max_objects` INT UNSIGNED DEFAULT
JSON_LENGTH(`array_objects`);
DECLARE `current_object` INT UNSIGNED DEFAULT 0;
WHILE `current_object` < `max_objects` DO
SET `json` := JSON_REPLACE(`json`,
JSON_UNQUOTE(
JSON_EXTRACT(
`array_objects`,
CONCAT('$[', `current_object`, ']')
)
), `value`);
SET `current_object` := `current_object` + 1;
END WHILE;
SELECT `json`;
END//

DELIMITER ;

SET @`j` := '
{
"cat": "meow",
"dog": "woof",
"parrot": [
{"volume": "quiet", "says": "hello"},
{"volume": "loud", "says": "polly"},
{"volume": "loud", "says": "cracker"}
]
}';

CALL `sp_update_json`(@`j`, 'pretty bird');

参见 db-fiddle .

关于MySQL 更新数组中的特定 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48552009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com