通过mysql json中的值删除数组元素

时间:2018-12-07 23:08:02

标签: mysql mysql-json

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

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

如果没有,是否有更好的方法来存储它,因此我可以根据需要删除元素?而且,数组中绝不会有重复项。

2 个答案:

答案 0 :(得分:2)

如果您知道数组中永远不存在重复项,则可以使用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_UNQUOTE的响应上使用JSON_SEARCH,以使其成为JSON_REMOVE的有效路径。

答案 1 :(得分:0)

这里有点不同的方法,但它允许一次从 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 子句中指定。