mysql - MySQL 中的 JSON_REMOVE 对象

标签 mysql arrays json

我正在尝试从 MySQL 中的 JSON 数组中删除对象。

我有一个名为 cart 的表,其中有两个字段 quote_id 类型 intitems 类型 json ,其内容如下存储在 MySQL 中的行

报价 ID:0

项目:

[ { “一”:42, “b”:“测试4” }, { “一”:32, “b”:“测试3” } ]

我正在尝试创建一个查询,该查询将从 json 数组中删除 json 对象。例如每个 { “一”:32, “b”:“测试3” }

我尝试了很多查询。首先我得到了这个:

UPDATE cart
SET items = IFNULL(JSON_REMOVE(items, JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3'))), items)
WHERE quote_id = 13392;

但是它只是从第二个对象中删除“b”:“test3”并在其中保留“a”:32,我需要一个查询来找到整个对象并将其删除。

这是我的第二个查询:

UPDATE cart
SET items = IFNULL(JSON_REMOVE(items, JSON_SEARCH(items, 'one', CAST('{"a": 32, "b": "test3"}' AS JSON))), items)
WHERE quote_id = 13392;

但是我认为对其进行搜索不起作用。我在不使用 CAST()AS JSON 的情况下尝试了它,但它仍然不起作用。

正如我所说,我很确定问题出在 JSON_SEARCH 上,但也许有人有解决方案?

谢谢!

最佳答案

JSON_SEARCH 返回属性的路径,而不是对象本身的路径。

因此您可以使用以下解决方案来通过 SUBSTR 获取对象路径:

SELECT JSON_REMOVE(items, 
    SUBSTR(JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')), 1, LOCATE('.', JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')))-1)
) FROM cart

您还可以使用REGEXP_SUBSTR来获取对象路径:

SELECT JSON_REMOVE(items, REGEXP_SUBSTR(JSON_UNQUOTE(JSON_SEARCH(items, 'one', 'test3')), '^\\$\\[[0-9]+\\]'))
FROM cart

demo on dbfiddle.uk

关于mysql - MySQL 中的 JSON_REMOVE 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56022118/

相关文章:

php - Zendfox安装: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'zendfox.zf_core_module' doesn't exist

java - 检查 jsonArray 是否为 null

mysql - 当我输入 Postgres 命令时,我的 mysql 客户端似乎是 'break'。任何想法如何撤消这个?

mysql - 从不同的表创建值的加权和

无法修改字符数组

java - 从 java 套接字发送时在整数数组中添加空白字符串

json - 如何在格式不良的 JSON 中对列表进行分组

javascript - Chrome 扩展程序 - 单击扩展程序、新选项卡和重定向

php - 基于纯 Html 的网站上的登录和用户帐户功能

python - 为什么我不能将列表中的元素相乘?