如何从 MySQL 的 JSON 数组中删除一个数字?

Posted

技术标签:

【中文标题】如何从 MySQL 的 JSON 数组中删除一个数字?【英文标题】:How to remove a number from MySQL's JSON array? 【发布时间】:2017-03-22 17:28:43 【问题描述】:

如果我有一个 mysql 表,其中包含一个名为 numbers 的 JSON 列,并且该列中包含 [1, 2, 3] 的记录(整数数组),我如何更新该记录以删除 2(所以它变成[1, 3])?

【问题讨论】:

您想使用查询还是使用任何脚本语言(如 php 或 Python)来执行此操作 用代码做这件事不是问题;我正在寻找一个仅限 sql 的解决方案,因为集合很大。 【参考方案1】:

在有人找到更好的解决方案之前,我只是将其转换为一个对象:"1": 1, "2": 2, "3": 3。是的,这更难看,占用更多磁盘空间,但您不必担心重复。

添加数字:

update tbl set numbers = json_insert(`numbers`, '$."4"', 4);

要删除一个数字:

update tbl set numbers = json_remove(`numbers`, '$."4"');

获取特定编号的行:

select * from tbl where json_contains_path(`numbers`, 'one', '$."4"');

【讨论】:

【参考方案2】:

我正在寻找自己的答案并来到这个问题,不想使用我继续搜索的对象。但是我找到了解决办法,你需要使用json_removejson_search的组合

以下内容从表 tbl 和列 numbers 中删除值 1

UPDATE tbl
SET numbers = JSON_REMOVE(
  numbers, replace(json_search(numbers, 'one', 1), '"', '')
)
WHERE json_search(numbers, 'one', 1) IS NOT NULL
    json_search 返回值所在的路径,即。 "$[0]" replace 去掉" 否则json_remove 会出错 json_remove 将从json_search 结果中删除路径

等等,你的价值被删除了。

注意:这里假定没有重复值

【讨论】:

不错。感谢您的贡献。 请记住,如果您在数字中存储整数值 (bugs.mysql.com/bug.php?id=79316),JSON_SEARCH 将找不到整数。 可以使用 JSON_UNQUOTE 代替替换 dev.mysql.com/doc/refman/5.7/en/… @MKroeders 我也在考虑一种解决重复问题的方法。 json_search 可以返回一个包含所有匹配项的数组,json_remove 可以有 2-n 个要删除的路径参数。现在考虑如何将其写入将数组扩展为多个项目的位置...嗯... @amaster 不知道直接的方法,经过一番测试。我认为使用重复(mysqltutorial.org/mysql-stored-procedure/mysql-repeat-loop)创建自己的函数,然后循环遍历它直到找不到密钥是你最安全的选择【参考方案3】:

顺便说一句,

 JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path]
 ...])

https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#function_json-search

只需 search_str

【讨论】:

以上是关于如何从 MySQL 的 JSON 数组中删除一个数字?的主要内容,如果未能解决你的问题,请参考以下文章

在java中,怎么从一个数组中删除一个数啊

如何在一个一维数组中插入一个和删除一个数

如何从javascript中第二个数组中存在的数组中删除元素? [复制]

java中 如何在一个数组中删除里面的元素

C语言如何从数组中删除一个指定元素?

如何从 MySQL 中提取 JSON 数组