Я получаю решение ...
Если кто-то заинтересован в решении ....
С этими данными:
CREATE TABLE t (
id INT(11) unsigned not null auto_increment,
`tag_1` VARCHAR(255),
`tag_2` VARCHAR(255),
`tag_3` VARCHAR(255),
primary key (id)
);
INSERT INTO t
(`tag_1`, `tag_2`, `tag_3`)
VALUES
('x', '', null),
('x','x', null),
('x', '', 'x'),
('x','x','x'),
(null, null, 'x')
;
Вот запрос:
select id, json_objectagg(field, val) as JSON from (
select id, 'tag_1' field, tag_1 val from t union
select id, 'tag_2' field, tag_2 val from t union
select id, 'tag_3' field, tag_3 val from t
) sub where val is not null and val != ''
group by sub.id;
Подзапрос поворачивает данные для использования JSON_OBJECTAGG
id field val
1 tag_1 x
2 tag_1 x
3 tag_1 x
4 tag_1 x
5 tag_1 null
1 tag_2 ''
2 tag_2 x
...
А затем группировка с помощью json_objectagg добивается цели!
| id | JSON |
| --- | ------------------------------------------ |
| 1 | {"tag_1": "x"} |
| 2 | {"tag_1": "x", "tag_2": "x"} |
| 3 | {"tag_1": "x", "tag_3": "x"} |
| 4 | {"tag_1": "x", "tag_2": "x", "tag_3": "x"} |
| 5 | {"tag_3": "x"} |
Вот DB Fiddle
Большое спасибо @Raimond Nijland за его комментарий, он поставил меня на правильный путь!:)