使用 json_remove 可以按路径删除数组元素,但要一个一个地指定路径。
JSON_REMOVE(json_doc, path[, path] ...)
https://mariadb.com/kb/en/json_remove/
为了想丢进去一个数组,给我找出指定多个数值,然后从源数组中删除,尝试写了下面的函数。
delimiter $$
DROP FUNCTION IF EXISTS `pdfn_array_remove`$$
CREATE FUNCTION `pdfn_array_remove`(
`array` JSON,
`items` JSON
)
RETURNS json
COMMENT '从 JSON 数组中删除元素,仅针对 int 型数组'
BEGIN
DECLARE i INT UNSIGNED DEFAULT 0;
DECLARE size INT UNSIGNED DEFAULT JSON_LENGTH(items);
DECLARE path VARCHAR(255) DEFAULT NULL;
IF array IS NULL THEN
return JSON_ARRAY();
END IF;
-- search every item and remove from source array
WHILE i < size do
SET path := JSON_SEARCH(array, 'one', JSON_VALUE(items, CONCAT('$[', i, ']')));
IF path IS NOT NULL THEN
SET array := JSON_REMOVE(array, JSON_VALUE(path, '$'));
END IF;
SET i := i + 1;
END WHILE;
RETURN array;
END$$
delimiter ;