ОБНОВЛЕНИЕ: теперь это возможно в MySQL 8 через функцию JSON_TABLE: https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
Мне нравятся новые функции JSON в MySQL 5.7, но я сталкиваюсь с блоком, пытающимся объединить значения из JSON в обычную структуру таблицы.
Захватить JSON, манипулировать и извлекать массивы из него и т.д. Очень просто. JSON_EXTRACT полностью. Но как насчет обратного перехода от массива JSON к строкам? Возможно, я разбираюсь в существующей функциональности MySQL JSON, но я не смог понять это.
Например, скажем, у меня есть массив JSON и я хочу вставить строку для каждого элемента в массиве со своим значением? Единственный способ, который я нашел, - написать группу JSON_EXTRACT (... '$ [0]') JSON_EXTRACT (... '$ [1]') и т.д. И объединить их вместе.
Или, скажем, у меня есть массив JSON и я хочу, чтобы GROUP_CONCAT() представлял его в одну строку, разделенную запятыми?
Другими словами, я знаю, что могу сделать это:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, CONCAT('$[', x.n, ']'))) AS val
FROM
(
SELECT 0 AS n
UNION
SELECT 1 AS n
UNION
SELECT 2 AS n
UNION
SELECT 3 AS n
UNION
SELECT 4 AS n
UNION
SELECT 5 AS n
) x
WHERE x.n < JSON_LENGTH(@j);
Но это ранит мои глаза. И мое сердце.
Как я могу сделать что-то вроде:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(JSON_EXTRACT(@j, '$[ * ]'))
... и объединяет ли он значения в массиве с самим массивом JSON?
Я думаю, что я ищу здесь что-то вроде JSON_SPLIT в соответствии с:
SET @j = '[1, 2, 3]';
SELECT GROUP_CONCAT(val)
FROM
JSON_SPLIT(JSON_EXTRACT(@j, '$[ * ]'), '$')
Если бы MySQL имел правильную функцию возврата таблицы STRING_SPLIT (val, 'separator'), я мог бы ее взломать (избегая быть проклятым), но она также недоступна.