如何将 SELECT JSON 数据存储为文本
How to SELECT JSON data stored in as text
我必须从 MariaDB 数据库中提取数据,所有者已将 JSON 数据存储在 varchar 字段中,格式如下:
[-100, -18.3, -10.1, 2.2, 5.8, ...]
我希望能够 select 来自每个 JSON 编码文本字段的单独条目。
我一直在阅读关于 MariaDB 中 JSON 支持的许多特性,并且我看过许多关于如何在文本字段中将数据存储为 JSON 的示例,但它们都需要更改数据的插入方式 and/or 架构。
我无法以任何方式更改数据库。我有只读权限。
数据库的所有者当前使用的是 MariaDB 10.0,但我可以让他们升级到 10.1
简而言之,给定以下(非常简单的示例),我如何 select ‘data’ 字段中的第二个元素?
我认为使用 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)
如果您可以通过 CONNECT
can use JsonGet_Real
函数升级到 10.1(从 MariaDB 10.1.9)。
尝试:
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)
我必须从 MariaDB 数据库中提取数据,所有者已将 JSON 数据存储在 varchar 字段中,格式如下:
[-100, -18.3, -10.1, 2.2, 5.8, ...]
我希望能够 select 来自每个 JSON 编码文本字段的单独条目。
我一直在阅读关于 MariaDB 中 JSON 支持的许多特性,并且我看过许多关于如何在文本字段中将数据存储为 JSON 的示例,但它们都需要更改数据的插入方式 and/or 架构。
我无法以任何方式更改数据库。我有只读权限。
数据库的所有者当前使用的是 MariaDB 10.0,但我可以让他们升级到 10.1
简而言之,给定以下(非常简单的示例),我如何 select ‘data’ 字段中的第二个元素?
我认为使用 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)
如果您可以通过 CONNECT
can use JsonGet_Real
函数升级到 10.1(从 MariaDB 10.1.9)。
尝试:
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)