给定以下存储在MySQL json
数据类型中的JSON:
"users": [
{
"group": "manager",
"userID": "a123"
},
{
"group": "employee",
"userID": "a456"
}
]
在不知道用户对象在数组中的位置的情况下,如何使用"userID": "a456"
删除用户对象?
如果我们知道位置,那么下面的方法是可行的:
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
jsondata,
"$.users[1]"
);';
然而,我正在寻找的东西是这样的:
$query = 'UPDATE jsontable SET
jsondata = JSON_REMOVE
(
jsondata,
(
JSON_SEARCH
(
jsondata,
"all",
JSON_OBJECT("userID", "a456")
)
)
);';
上面的代码为jsondata
列生成了一个数据截断错误。其他变体,如直接放置userID而不是JSON_OBJECT
,也会产生错误。
我需要在查询中修复什么,才能让JSON_SEARCH
返回我想要从数组中删除的特定对象的路径?
请记住,它应该只在users
内部进行搜索,因为主JSON对象上可能有使用这些ID的其他属性。
发布于 2021-10-25 15:12:38
补充了Michael的答案。
为了删除双引号,他使用了REPLACE
函数。
为此,我们可以使用JSON_UNQUOTE。
此外,解决方案将不起作用,因为从JSON_SEARCH返回的路径将指向传递的搜索字符串。因此,它将从对象而不是对象中删除键值对。
因此,要删除完整的对象,我们必须获取json的前一个路径。
UPDATE jsontable
SET jsondata = JSON_REMOVE(
jsondata, JSON_UNQUOTE(
REPLACE(
JSON_SEARCH( jsondata, 'one', 'a456', null, '$**.users' )
, '.userID'
, ''
)
)
);
因为我们需要以前的路径,所以我在这里硬编码它。
https://stackoverflow.com/questions/50767317
复制相似问题