Преобразование полей с пустыми или нулевыми значениями в данные JSON на MYSQL - PullRequest
0 голосов
/ 15 марта 2019

У меня есть таблица с несколькими полями, которые я хочу скомпилировать только в одном поле json. Проблема в том, что в этих столбцах есть несколько строковых значений NULL и EMTPY, и вы не хотите помещать их в JSON, просто сохраняйте соответствующие значения. Я хочу сделать это с минимальным количеством запросов.

Вот мой текущий подход:

    select
       json_remove(
         json_remove(json, json_search(json, 'one', 'null')),
         json_search(json, 'all', '')
       ) result
    from (
       select
              json_object(
                  'tag_1', coalesce(tag_1, 'null'),
                  'tag_2', coalesce(tag_2, 'null'),
                  'tag_3', coalesce(tag_3, 'null')
                ) json
       from leads
     ) l2;

Но проблема в том, что вывод json_search несовместим с вводом json_remove. Есть идеи?

Вот некоторые примеры данных:

-------------------------
| tag_1 | tag_2 | tag_3 |
-------------------------
|   x   |       |  null |
|       |   y   |   z   |
-------------------------

И что я оцениваю в результате:

--------------------------------
| result                       |
--------------------------------
| {'tag_1': 'x'}               |
| {'tag_2': 'y', 'tag_3': 'z'} |
--------------------------------

Спасибо.

1 Ответ

0 голосов
/ 09 апреля 2019

Я получаю решение ...

Если кто-то заинтересован в решении ....

С этими данными:

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 за его комментарий, он поставил меня на правильный путь!:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...