【发布时间】:2020-12-13 16:03:43
【问题描述】:
我有一个类似的TABLBE
CREATE TABLE `saved_links` (
`link_entry_id` bigint(20) NOT NULL AUTO_INCREMENT,
`link_id` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_data_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`link_entry_id`),
UNIQUE KEY `link_id` (`link_id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='saved Links'
并插入
INSERT INTO `saved_links`(`link_id`, `user_data_json` )
VALUES (
'AABBCC',
'[{
"mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}},
{
"papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
{
"daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
{
"son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}
}]'
), (
'DDEEFF',
'[{
"mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}},
{
"papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}}
]'
) ;
选择*
---------------------------------------------------
`link_id` | `user_data_json`
----------------------------------------------------
`AABBCC` | [{
| "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}},
| {
| "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
| {
| "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
| {
| "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}}]
---------------------------------------------------------------------------------------------
`DDEEFF` | [{
| "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}},
| {
| "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}}
| ]
---------------------------------------------------------------------------------------------
我想从AABBCC 中删除"papa@gmail_DOT_com" 和他所有的values
我尝试过(我使用的是 10.4.15-MariaDB)
UPDATE `saved_links`
SET `user_data_json` = IFNULL(
JSON_REMOVE( `user_data_json`, JSON_UNQUOTE(
REPLACE( JSON_SEARCH(
`user_data_json`, 'all', 'papa@gmail_DOT_com', NULL, '$**.papa@gmail_DOT_com'), '.u_email', '' ) ) ), `user_data_json` )
where `link_id` = 'AABBCC'
返回
---------------------------------------------------
`link_id` | `user_data_json`
----------------------------------------------------
`AABBCC` | [{
| "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}},
| {}, //-> Notice these empty braces that are left behind.
| {
| "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
| {
| "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}}]
有没有办法避免删除后出现空的{}?
UPDATE01- 如果您尝试:
UPDATE `saved_links` SET
`user_data_json` =
JSON_REMOVE(`user_data_json`, '$.papa@gmail_DOT_com')
WHERE `link_id`= 'AABBCC'
这会删除user_data_json WHERE link_id= 'AABBCC' 列中的所有数据`
谢谢
【问题讨论】:
-
使用JSON_REMOVE ?
-
已经用过...看看我在帖子中尝试了什么
-
我编辑了标签,因为您使用的是 MariaDB,而不是 MySQL。这两个产品对 JSON 数据有不同的实现。它们不应被视为同一个数据库产品。
-
@BillKarwin 谢谢。虽然我仍然卡住了。如果您有任何想法,请告诉我
标签: mariadb key mysql-json mariadb-10.4