Как выбрать данные JSON, хранящиеся в виде текста
Я должен извлечь данные из базы данных MariaDB, где владельцы хранят данные JSON в полях varchar в форме:
[-100, -18.3, -10.1, 2.2, 5.8, ...]
Я хотел бы иметь возможность выбирать отдельные записи из каждого из этих текстовых полей в кодировке JSON.
Я читал о многих возможностях поддержки JSON в MariaDB и рассмотрел множество примеров того, как данные могут храниться в виде JSON в текстовых полях, но все они потребуют изменений в способе вставки данных и / или схемы.
Я не могу изменить БД в любом случае. У меня есть доступ только для чтения.
Владельцы БД в настоящее время используют MariaDB 10.0, но, возможно, я смогу заставить их перейти на 10.1
Короче говоря, учитывая следующий (очень простой пример), как я могу выбрать 2-й элемент в поле "данные"?
Я предполагаю, что использование возможностей JSON - это путь (учитывая все данные в формате JSON), но есть ли другой путь? Производительность не так уж важна.
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)
1 ответ
Если вы можете обновить до 10.1 (с MariaDB 10.1.9) через CONNECT
можешь использовать JsonGet_Real
функция.
Пытаться:
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)