0

所有者がフォームの varchar フィールドに JSON データを格納している MariaDB データベースからデータを抽出する必要があります。

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

これらの JSON エンコードされたテキスト フィールドのそれぞれから個々のエントリを選択できるようにしたいと考えています。

MariaDB での JSON サポートの多くの機能について読んでおり、データをテキスト フィールドに JSON として保存する方法の例をたくさん見てきましたが、データの挿入方法やスキーマを変更する必要があります。

DBを変更することはできません。私は読み取り専用アクセス権を持っています。

DBの所有者は現在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)
4

1 に答える 1

0

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)
于 2016-06-17T15:52:16.940 に答える