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

Joh*_*ing 3 mysql mysql-5.7

如果我有一个调用了JSON列的MySQL表,numbers并且[1, 2, 3]该列中有一个记录(整数数组),那么如何更新该记录以删除2(所以它变成了[1, 3])?

MKr*_*ers 8

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

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

UPDATE tbl
SET numbers = JSON_REMOVE(
  numbers, replace(json_search(numbers, 'one', 1), '"', '')
)
WHERE json_search(numbers, 'one', 1) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
  1. json_search 返回值的路径,即. "$[0]"
  2. replace删除"否则将发生错误json_remove
  3. json_remove将从json_search结果中删除路径

瞧,你的价值被删除了.

注意:这假定没有重复值

  • 请记住,如果数字存储整数值,则JSON_SEARCH将找不到整数(https://bugs.mysql.com/bug.php?id=79316). (6认同)
  • 您可以使用JSON_UNQUOTE而不是替换https://dev.mysql.com/doc/refman/5.7/en/json-modification-functions.html#function_json-unquote (2认同)

Joh*_*ing 5

在有人找到更好的解决方案之前,我只是将其转换为对象:{"1": 1, "2": 2, "3": 3}.是的,这更加丑陋并占用更多的磁盘空间,但您可以获得不必担心重复的好处.

要添加数字:

update tbl set numbers = json_insert(`numbers`, '$."4"', 4);
Run Code Online (Sandbox Code Playgroud)

要删除一个数字:

update tbl set numbers = json_remove(`numbers`, '$."4"');
Run Code Online (Sandbox Code Playgroud)

获取具有特定数字的行:

select * from tbl where json_contains_path(`numbers`, 'one', '$."4"');
Run Code Online (Sandbox Code Playgroud)