1
我想多列从一个表转换成单一的JSON在另一个表中MySQL数据库(16年7月5日版)。我想使用SQL查询。MySQL的转换多个列成JSON
一台这个样子的
CREATE TABLE `log_old` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`temperature` DECIMAL(5,2) NULL DEFAULT NULL,
`heating_requested` BIT(1) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
)COLLATE='utf8_general_ci'
ENGINE=InnoDB;
二表看起来像这样
CREATE TABLE `log_new` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
'data' JSON,
PRIMARY KEY (`id`),
)COLLATE='utf8_general_ci'
ENGINE=InnoDB;
数据JSON在log_new表的所有行相同的格式,它应该是这样的
{
temperature: value,
heatingRequested: false
}
例如log_old这个样子
+--+-----------+-----------------+
|id|temperature|heating_requested|
+--+-----------+-----------------+
|1 | 12 | true |
+--+-----------+-----------------+
|2 | 14 | true |
+--+-----------+-----------------+
|3 | 20 | false |
+--+-----------+-----------------+
,我想log_new这个样子
+--+-----------------------------------------+
|id| data |
+--+-----------------------------------------+
|1 |{temperature:12, heatingRequested: true} |
+--+-----------------------------------------+
|2 |{temperature:14, heatingRequested: true} |
+--+-----------------------------------------+
|3 |{temperature:20, heatingRequested: false}|
+--+-----------------------------------------+
我试图用JSON_INSERT()
SELECT JSON_INSERT((SELECT data FROM log_new ), '$.temperature',
(SELECT temperature FROM log_old));
但这抛出错误 “子查询返回多个1行” 我来了仅这就是工作的解决方案,同时使用,做到这一点逐行但是这可能需要很长一段时间
DELIMITER //
CREATE PROCEDURE doLog()
BEGIN
SELECT COUNT(*) into @length from log_zone;
SET @selectedid = 1;
WHILE @selectedid < @length DO
SELECT temperature,heating_requested INTO @temperature,@heating_requested FROM log_old where [email protected];
SELECT JSON_OBJECT('temperature',@temperature,'heatingRequested',@heating_requested) into @data_json;
SET @selectedid = @selectedid + 1;
INSERT INTO log_new (data) VALUES (@data_json);
END WHILE;
END;
//
CALL doLog()
双方你的子查询((SELECT FROM log_new数据), '$ .temperature',(SELECT温度log_old));'返回多个行,以便错误是正确的。检查插入选择语法 - http://dev.mysql.com/doc/refman/5.7/en/insert-select.html - 并将你的函数重写为一个语句,它将从'select json_object(...)中进行批量插入... '在整个表 – JosMac
'INSERT INTO log_new(数据) SELECT JSON_OBJECT(“温度”,(SELECT温度log_old));'你觉得这个林不知道如果我理解你 – Morme
嵌套的选择仍然会产生更多的呢?。每行外部选择1行,至少需要将条件添加到嵌套选择中,但更好 - 在一个选择中连接两个表。 – JosMac