Элементы JSON в строку ИЛИ JSON в таблицу Row в MYSQL (экспорт JSON в MySQL) - PullRequest
0 голосов
/ 26 декабря 2018

У нас может быть много запросов на сохранение json в базу данных.Иногда нам нужно преобразовать набор ключей JSON в Table - Rows.Как извлечь полный json в таблицу Mysql?

т.е. наличие ниже json и требование хранить каждый набор как строку в таблице.

'{
"log": [
{
"datetime": "2017-10-25 07:19:55",
"Activity": "Activity 1"
},
{
"datetime": "2017-10-25 07:20:05",
"Activity": "Activity 2"
},
{
"datetime": "2017-10-25 07:20:31",
"Activity": "Activity 3"
},
{
"datetime": "2017-10-25 07:20:31",
"Activity": "Activity 4"
},
{
"datetime": "2017-10-25 07:21:03",
"Activity": "Activity 5"
},
{
"datetime": "2017-10-25 13:56:42",
"Activity": "Activity 6"
},
{
"datetime": "2017-10-25 13:56:53",
"Activity": "Activity 7"
},
{
"datetime": "2017-10-25 13:57:03",
"Activity": "Activity 8"
},
{
"datetime": "2017-10-25 13:57:04",
"Activity": "Activity 9"
}, 
{ "datetime": "2017-10-25 13:57:53",
"Activity": "Activity 10"
},
{
"datetime": "2017-10-25 13:57:59",
"Activity": "Activity 11"
},
{
"datetime": "2017-10-25 13:58:01",
"Activity": "Activity 12"
},
{
"datetime": "2017-10-25 13:58:01",
"Activity": "Activity 13"
}
]
} '

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

MySQL 8.0 имеет функцию JSON_TABLE:

INSERT INTO NewTable 
  SELECT * FROM JSON_TABLE('...your JSON ...', '$.log[*]' columns(
    rowid for ordinality, 
    dt datetime path '$.datetime', 
    activity varchar(20) path '$.Activity')
  ) as t
0 голосов
/ 26 декабря 2018

JSON может храниться в базе данных с различными типами данных.то есть JSON, VACRHAR, TEXT ... и т. д.Для экспорта отчета или фильтрации значений элемента JSON у нас должны быть разные решения, чтобы сделать это.

Создание таблицы для хранения JSON в таблице MySQL.

CREATE TABLE test_Json(id INT, activity_log JSON);

Вставка данных выборки в таблицу.Данные поля JSON вставляются в тип данных JSON, но также могут иметь тип VARCHAR или Text.

INSERT INTO test_Json(id, activity_log)
VALUES(1,
'{
"log": [
{
"datetime": "2017-10-25 07:19:55",
"Activity": "Activity 1"
},
{
"datetime": "2017-10-25 07:20:05",
"Activity": "Activity 2"
},
{
"datetime": "2017-10-25 07:20:31",
"Activity": "Activity 3"
},
{
"datetime": "2017-10-25 07:20:31",
"Activity": "Activity 4"
},
{
"datetime": "2017-10-25 07:21:03",
"Activity": "Activity 5"
},
{
"datetime": "2017-10-25 13:56:42",
"Activity": "Activity 6"
},
{
"datetime": "2017-10-25 13:56:53",
"Activity": "Activity 7"
},
{
"datetime": "2017-10-25 13:57:03",
"Activity": "Activity 8"
},
{
"datetime": "2017-10-25 13:57:04",
"Activity": "Activity 9"
}, { "datetime": "2017-10-25 13:57:53",
"Activity": "Activity 10"
},
{
"datetime": "2017-10-25 13:57:59",
"Activity": "Activity 11"
},
{
"datetime": "2017-10-25 13:58:01",
"Activity": "Activity 12"
},
{
"datetime": "2017-10-25 13:58:01",
"Activity": "Activity 13"
}
]
} ');

INSERT INTO test_Json(id, activity_log)
VALUES(2,'
{
"log": [
{ "datetime": "2017-10-29 21:56:27",
"Activity": "Activity-11"
},
{
"datetime": "2017-10-29 21:56:27",
"Activity": "Activity-12"
},
{
"datetime": "2017-10-29 21:56:27",
"Activity": "Activity-13"
},
{
"datetime": "2017-10-29 21:56:27",
"Activity": "Activity-14"
},
{
"datetime": "2017-10-29 21:56:35",
"Activity": "Activity-15"
},
{
"datetime": "2017-10-29 21:56:49",
"Activity": "Activity-16"
},
{
"datetime": "2017-10-29 21:56:49",
"Activity": "Activity-17"
},
{
"datetime": "2017-10-29 21:56:49",
"Activity": "Activity-18"
}
]
}');

Запрос на получение JSON Exported в виде массива JSON со значением длины JSON

SELECT TJ.id,
JSON_LENGTH(JSON_EXTRACT(TJ.activity_log, '$**.datetime')) as Json_Length,
JSON_EXTRACT(TJ.activity_log, '$**.datetime') as json_array_message,
JSON_EXTRACT(TJ.activity_log, '$**.Activity') as json_array_datetime
FROM test_Json TJ
WHERE JSON_VALID(TJ.activity_log) = 1;

JSON_VALID() проверит данные столбца JSON, независимо от того, являются ли данные JSON правильными или нет.Если нет, то он будет отфильтрован из запроса.

Рекурсивное CTE (общее табличное выражение) для получения значений элементов n-уровня в формате строки

WITH RECURSIVE CTE_json (id, array_datetime, array_message,seq) AS
(
SELECT id, 
JSON_EXTRACT(JSON_EXTRACT(activity_log, '$**.datetime'), CONCAT('$[', 0, ']')), 
JSON_EXTRACT(JSON_EXTRACT(activity_log, '$**.Activity'), CONCAT('$[', 0, ']')), 
0 as seq
FROM test_Json
UNION ALL
SELECT TJ.id, 
JSON_EXTRACT(JSON_EXTRACT(TJ.activity_log, '$**.datetime'), CONCAT('$[', rc.seq +1, ']')) as array_datetime, 
JSON_EXTRACT(JSON_EXTRACT(TJ.activity_log, '$**.Activity'), CONCAT('$[', rc.seq +1, ']')) as array_message, 
rc.seq +1 AS seq
FROM CTE_json rc
INNER JOIN test_Json TJ ON rc.id = TJ.id
WHERE rc.seq+1 < JSON_LENGTH(JSON_EXTRACT(TJ.activity_log, '$**.datetime'))
)

SELECT *
FROM CTE_json cj
ORDER BY id, seq;

Если текущая версия MySQL не поддерживает рекурсивный CTE, мы можем использовать другие альтернативы LOOP.

...