MySQL 5.7 Объединить значения строки JSON в одну строку

У меня есть таблица, в которой столбец content состоит из объекта JSON с примерным значением:

{"blocks":[{"score":"A"},{"score":"A"},{"score":"B"}]}

То, что я пытаюсь сделать, это SELECT для строкового представления всех оценок, поэтому для этого примера я хочу:

AAB

Я смог легко разобрать JSON:

SELECT json_extract(content, '$.blocks[*].score') AS scores

Что приводит к:

["A", "A", "B"]

но по какой-то причине у меня возникла проблема с объединением этого массива JSON в одну строку (помимо приведения его к строке и вызова нескольких функций замены для удаления кавычек и скобок). Я пробовал варианты CONCAT и GROUP_CONCAT, но не нашел решения.

Как правильно объединить эту строку JSON в одну строку?


person Chris Schlitt    schedule 02.02.2021    source источник
comment
Я не думаю, что есть встроенная функция MySQL, которая объединит массив в строку.   -  person Barmar    schedule 02.02.2021
comment
Если вы нормализовали свою схему вместо использования JSON, вы могли бы использовать GROUP_CONCAT().   -  person Barmar    schedule 03.02.2021
comment
По моим наблюдениям, на большинство вопросов об использовании JSON в MySQL можно ответить: было бы намного проще, если бы вы не использовали JSON.   -  person Bill Karwin    schedule 03.02.2021


Ответы (1)


Вы можете использовать таблицу каталога, такую ​​как information_schema.tables, чтобы генерировать строки для итерации по длине массива, а затем объединять все элементы с помощью GROUP_CONCAT(), например

SELECT GROUP_CONCAT(
                    JSON_UNQUOTE(
                       JSON_EXTRACT(content,
                                    CONCAT('$.blocks[', i - 1, '].score'))
                                   ) 
                       SEPARATOR '') AS scores
  FROM (SELECT JSON_LENGTH(JSON_EXTRACT(content, '$.blocks[*].score')) AS len,
               @i := @i + 1 AS i,
               content
          FROM tab
          JOIN information_schema.tables
          JOIN (SELECT @i := 0) AS i) AS t
 WHERE i <= len;

+--------+
| scores |
+--------+
|  AAB   |
+--------+

Демо

person Barbaros Özhan    schedule 02.02.2021