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

Posted

技术标签:

【中文标题】在mysql json中按值删除数组元素【英文标题】:Remove array element by value in mysql json 【发布时间】:2019-05-09 17:08:08 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案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_SEARCH 的响应中使用JSON_UNQUOTE 以使其成为JSON_REMOVE 的有效路径。

【讨论】:

如果元素不存在怎么办?以上内容将使整个字段无效。 @David542 好点!我已经修改了我的答案。 列数据被截断 @Nick 我在 php 中使用这个查询:Update question set $colName=IF(JSON_CONTAINS($colName, '$userId'), JSON_REMOVE($colName, '$.\"$userId\"'),JSON_ARRAY_APPEND($colName, '$', ?)) where question_id='$questionId' 并得到这个错误:Data truncated for column @ImanMarashi 这与此答案中的代码不同。我建议您在代码中提出一个新问题,确保包含一些演示问题的示例数据。

以上是关于在mysql json中按值删除数组元素的主要内容,如果未能解决你的问题,请参考以下文章

在python中按值删除字典项的最佳方法是啥? [复制]

php - 从json对象中按值删除[关闭]

如何按值从数组中删除一个元素

C++ - 在自定义数据类型向量中按值匹配和替换元素

PHP数组按值删除(不是键)

在NodeJS中按值排序数组