I have a TABLBE like
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'
AND INSERT
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"}}
]'
) ;
SELECT*
---------------------------------------------------
`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"}}
| ]
---------------------------------------------------------------------------------------------
I would like to REMOVE "papa@gmail_DOT_com"
and all his values
from AABBCC
I have tried (Am using 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'
This returns
---------------------------------------------------
`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"}}]
Is there a way to avoid having the empty {}
after removal?
UPDATE01- If you try:
UPDATE `saved_links` SET
`user_data_json` =
JSON_REMOVE(`user_data_json`, '$.papa@gmail_DOT_com')
WHERE `link_id`= 'AABBCC'
This deletes all data in the column user_data_json
WHERE link_id
= 'AABBCC'`
Thank you
select json_remove(user_data_json,'$[1]') from saved_links where link_entry_id=19;
will return:
I am not really using JSON, but got my inspiration from the second example here: https://mariadb.com/kb/en/json_remove/
EDIT:
You could optimize this:
output:
With this you could 'convert'
"papa@gm...."
to1
.EDIT2: Combining different JSON functions from Mariadb or from MySQL can do a lot:
output (please scroll right, the last column is more interesting than the first column ):
EDIT (2020-12-26): I did have a look at mariadb, and below is tested on version
10.5.8
.But use of
$[1]
is not desired, soe whe have to determine the correct value for1
:.
I
is the correct value for findingpapa@gmail_DOT_com
.