【发布时间】:2021-07-21 21:14:00
【问题描述】:
我有一个 MySQL 5.7 数据库,其中包含一个包含字符串数组的 JSON 列。
我需要在一个查询中按值从数组中删除不同数量的这些字符串。
示例 JSON:
["1-1-2", "1-1-3", "1-2-2", "1-2-3", "1-1-16", "1-1-17"]
我可能需要删除“1-1-16”和“1-1-17”,所以我最终得到:
["1-1-2", "1-1-3", "1-2-2", "1-2-3"]
在其他时候,我可能需要在一个查询中只删除一个或多个值。
JSON_REMOVE()可以接受多个路径参数,但是问题是当指定多个路径时,JSON_REMOVE()的结果是从左到右依次传递的每个路径,这使得每个通过的路径都很难使用JSON_SEARCH() 的结果。
例如,这不起作用,因为在删除 '1-1-16' 后,第二个 JSON_SEARCH 将返回不正确的 '1-1-17' 索引:
UPDATE json_meta
SET document =
JSON_REMOVE( document,
JSON_UNQUOTE(JSON_SEARCH(document, 'one', '1-1-16')),
JSON_UNQUOTE(JSON_SEARCH(document, 'one', '1-1-17')),
)
WHERE id=10
您需要这样做:
UPDATE json_meta
SET document =
JSON_REMOVE( document,
JSON_UNQUOTE(JSON_SEARCH(document, 'one', '1-1-16')),
JSON_UNQUOTE(JSON_SEARCH(JSON_REMOVE( document,
JSON_UNQUOTE(JSON_SEARCH(document, 'one', '1-1-16'))), 'one', '1-1-17'))
)
WHERE id=10
查询随着需要删除的每个附加字符串呈指数级增长。
我想知道最好的解决方案是否只是使用链式REPLACE() 并在每个字符串上使用逗号的所有排列(即每个字符串之前有一个逗号,之后有一个逗号,前后都有一个逗号)。
最后说明:我发现另一个问题与here 描述的完全相同的问题。但是,该问题没有公认的答案,并且其中的一个答案非常复杂。这个答案表明 MySQL 5.6 没有太多 JSON 支持。我想知道,由于我使用的是 MySQL 5.7,是否有更简单的解决方案?
【问题讨论】:
-
不使用 MySQL JSON 的又一个理由,恕我直言。如果您对表格进行规范化,这将是微不足道的。
-
是的,MySQL 5.6 和 MySQL 5.7 和 MySQL 8.0 中的 simple 解决方案是相同的:将多值属性存储为每行一个值。然后您可以按它们的值而不是它们的位置删除两行。哪个是“第一”并不重要。
-
您可以使用存储过程,在其中拆分一个字符串并运行一个循环并删除一个一个
-
@Barmar 我同意,但现在无法重新架构此数据库。 :)
-
最好的办法是使用存储过程在循环中删除它们,而不是尝试在一个查询中完成。
标签: mysql mysql-5.7 mysql-json