【问题标题】:Remove array element by value in mysql json在mysql json中按值删除数组元素
【发布时间】:2025-12-14 00:25:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql mysql-json


    【解决方案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 这与此答案中的代码不同。我建议您在代码中提出一个新问题,确保包含一些演示问题的示例数据。