2016-06-16 22 views
0

Ich habe Daten aus einer MariaDB Datenbank zu extrahieren, wo der Eigentümer JSON-Daten in varchar Feldern im Formular gespeichert hat:Wie SELECT JSON-Daten gespeichert in als Text

[-100, -18.3, -10.1, 2.2, 5.8, ...] 

würde Ich mag zu können, wählen Sie einzelne Einträge von jedem dieser JSON-codierten Textfelder.

Ich habe gelesen, über die vielen Funktionen der JSON-Unterstützung in MariaDB und ich habe viele Beispiele untersucht, wie Daten als JSON in Textfeldern gespeichert werden können, aber alle würden Änderungen erfordern, wie die Daten eingefügt werden und/oder das Schema.

Ich kann die DB in keiner Weise ändern. Ich habe Lesezugriff.

Die Eigentümer der DB sind derzeit mit MariaDB 10.0, aber ich kann sie erhalten, in der Lage zu 10.1

Kurz zu aktualisieren, dem folgende (sehr einfachen Beispiel) gegeben, wie kann ich die 2. wählen Element im Feld 'Daten'?

Ich nehme an, die Verwendung der JSON-Features ist der Weg zu gehen (alle Daten sind JSON), aber gibt es einen anderen Weg? Leistung ist nicht so wichtig.

MariaDB [mtest]> show columns from cal from mtest; 
+-------+--------------+------+-----+---------+-------+ 
| Field | Type   | Null | Key | Default | Extra | 
+-------+--------------+------+-----+---------+-------+ 
| data | varchar(255) | YES |  | NULL |  | 
+-------+--------------+------+-----+---------+-------+ 
1 row in set (0.00 sec) 

MariaDB [mtest]> select * from cal; 
+---------+ 
| data | 
+---------+ 
| [10.1,12.0,16.78,18.9] | 
+---------+ 
1 row in set (0.00 sec) 
+0

Was meinen Sie von *** 2. Element *** in der field' ‚data‘? – Blank

+0

Im angegebenen Beispiel meine ich die '12.0 ' – Brad

Antwort

0

Wenn Sie sich auf 10,1 (von MariaDB 10.1.9) über CONNECT kann JsonGet_Real Funktion aktualisieren können.

Versuchen:

MariaDB [_]> SELECT VERSION(); 
+-----------------+ 
| VERSION()  | 
+-----------------+ 
| 10.1.14-MariaDB | 
+-----------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> INSTALL SONAME 'ha_connect'; 
Query OK, 0 rows affected (0.01 sec) 

MariaDB [_]> CREATE FUNCTION `jsonget_real` RETURNS REAL SONAME 'ha_connect.so'; 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> DROP TABLE IF EXISTS `cal`; 
Query OK, 0 rows affected, 1 warning (0.01 sec) 

MariaDB [_]> CREATE TABLE IF NOT EXISTS `cal` (
    -> `data` VARCHAR(255) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

MariaDB [_]> INSERT INTO `cal` 
    -> (`data`) 
    -> VALUES 
    -> ('[10.1,12.0,16.78,18.9]'); 
Query OK, 1 row affected (0.00 sec) 

MariaDB [_]> SELECT `data` FROM `cal`; 
+------------------------+ 
| data     | 
+------------------------+ 
| [10.1,12.0,16.78,18.9] | 
+------------------------+ 
1 row in set (0.00 sec) 

MariaDB [_]> SELECT `jsonget_real`(`data`, '[1]', 2) FROM `cal`; 
+--------------------------------+ 
| jsonget_real(`data`, '[1]', 2) | 
+--------------------------------+ 
|       12.00 | 
+--------------------------------+ 
1 row in set (0.00 sec) 
+0

Vielen Dank - vor allem für das Beispiel. Ich schulde dir ein Bier! – Brad