按 mysql json 中的值删除数组元素

Remove array element by value in mysql json

是否可以通过 mysql 中的 json 数组中的值(而不是其索引)删除元素?例如:

# ['new', 'orange']
update waitinglist SET new = JSON_REMOVE("orange", '$') WHERE id=2;
# now it will be ['new']

如果没有,是否有更好的存储方式,以便我可以根据需要删除元素?此外,数组中永远不会有重复项。

如果您知道数组中永远不会有重复项,您可以使用 JSON_SEARCH 找到要删除的值的路径,然后使用 JSON_REMOVE 将其删除。请注意,您需要检查 JSON_SEARCH 是否确实找到了一个值,否则 JSON_REMOVE 将使整个字段无效:

UPDATE waitinglist 
SET new = JSON_REMOVE(new, JSON_UNQUOTE(JSON_SEARCH(new, 'one', 'orange')))
WHERE JSON_SEARCH(new, 'one', 'orange') IS NOT NULL

我做了一个小的demo on dbfiddle

请注意,您必须在 JSON_SEARCH 的响应中使用 JSON_UNQUOTE 才能使其成为 JSON_REMOVE.

的有效路径

这里的方法有点不同,但它允许一次从 json 数组中删除多个值。我正在使用子查询来获取正确的数组值,然后只更新 json 字段。因此,在您的情况下,sql 查询将如下所示:

UPDATE waitinglist w
SET w.new =
        (
            SELECT JSON_ARRAYAGG(new)
            FROM JSON_TABLE(w.new, '$[*]' COLUMNS (new VARCHAR(255) PATH '$')) AS list
            WHERE list.new NOT IN ('orange')
        )
WHERE w.id = 2;

您要从 json 数组中删除的值必须在子查询的 NOT IN 子句中指定。