Ich versuche, mehrere Spalten aus einer Tabelle in einzelne JSON in einer anderen Tabelle in MySQL-Datenbank (Version 5.7.16) zu konvertieren. Ich möchte SQL-Abfrage verwenden.MySQL konvertieren mehrere Spalten in JSON
Erste Tabelle wie folgt aussehen
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;
zweite Tabelle wie folgt aussehen
CREATE TABLE `log_new` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
'data' JSON,
PRIMARY KEY (`id`),
)COLLATE='utf8_general_ci'
ENGINE=InnoDB;
Daten JSON gleiche Format in allen Zeilen von log_new Tabelle hat, sollte es so aussehen
{
temperature: value,
heatingRequested: false
}
zum Beispiel log_old wie folgt aussehen
und ich möchte log_new so aussah
+--+-----------------------------------------+
|id| data |
+--+-----------------------------------------+
|1 |{temperature:12, heatingRequested: true} |
+--+-----------------------------------------+
|2 |{temperature:14, heatingRequested: true} |
+--+-----------------------------------------+
|3 |{temperature:20, heatingRequested: false}|
+--+-----------------------------------------+
Ich versuchte JSON_INSERT zu verwenden()
SELECT JSON_INSERT((SELECT data FROM log_new ), '$.temperature',
(SELECT temperature FROM log_old));
aber throw Fehler "Unterabfrage gibt mehr als 1 Zeile" Ich kam mit nur Lösungen, die arbeiten, während zu verwenden, und es Zeile für Zeile tun, aber das kann lange dauern
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()
sowohl Ihre Unterabfragen in SELECT JSON_INSERT ((Daten aus log_new SELECT), '.Temperatur $' (SELECT Temperatur von log_old)); 'mehrere Zeilen zurückgeben, so Fehler ist richtig. Überprüfen Sie die Insert-Select-Syntax - http://dev.mysql.com/doc/refman/5.7/en/insert-select.html - und schreiben Sie Ihre Funktion in eine Anweisung um, die eine Masseninsertion von 'select json_object (... 'über die gesamte Tabelle – JosMac
' INSERT INTO log_new (Daten) SELECT JSON_OBJECT ('Temperatur', (SELECT Temperatur FROM log_old)); 'Hast du das gedacht? Ich bin mir nicht sicher, ob ich dich verstanden habe. – Morme
Geschachtelte Auswahl erzeugt immer noch mehr 1 Zeile pro Zeile der äußeren Auswahl Sie müssen mindestens eine Bedingung in die geschachtelte Auswahl einfügen, aber besser - verbinden Sie beide Tabellen in einer Auswahl. – JosMac