如何选择以文本形式存储的JSON数据

时间:2016-06-16 22:59:19

标签: mysql json mariadb mariadb-connect-engine

我必须从MariaDB数据库中提取数据,其中所有者已在表格中的varchar字段中存储JSON数据:

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

我希望能够从每个JSON编码的文本字段中选择单个条目。

我一直在阅读有关MariaDB中JSON支持的许多功能的内容,我已经查看了许多关于如何在文本字段中将数据存储为JSON的示例,但它们都需要更改数据的插入方式和/或架构。

我无法以任何方式更改数据库。我有ReadOnly访问权限。

数据库的所有者目前正在使用MariaDB 10.0,但我可以将它们升级到10.1

简而言之,鉴于以下(非常简单的示例),如何在“数据”字段中选择第二个元素?

我假设使用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 个答案:

答案 0 :(得分:0)

如果您可以通过CONNECT升级到10.1(来自MariaDB 10.1.9),可以使用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)