在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中按值删除数组元素的主要内容,如果未能解决你的问题,请参考以下文章