如何从 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_remove
和json_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 数组中删除一个数字?的主要内容,如果未能解决你的问题,请参考以下文章