是否可以通过mysql中的json数组中的值(而不是其索引)删除元素?例如:
# ['new', 'orange']
update waitinglist SET new = JSON_REMOVE("orange", '$') WHERE id=2;
# now it will be ['new']
如果没有,是否有更好的方法来存储它,因此我可以根据需要删除元素?而且,数组中绝不会有重复项。
答案 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
子句中指定。