2016-12-15 8 views
1

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() 
+0

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

+0

' 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

+0

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

Antwort

1

Da alle Ihre Daten in einzelnen Zeilen verfügbar sind, müssen Sie keine Unterabfragen oder Schleifen zum Erstellen des JSON-Objekts verwenden.

können Sie versuchen, so etwas wie:

INSERT INTO log_new (data) 
    SELECT json_object('temperature',log_old.temperature,'heatingRequested',log_old.heating_requested) 
    FROM log_old 
Verwandte Themen