如何从一个字符串变量中提取唯一的嵌套变量名?

时间:2018-05-01 17:26:36

标签: mysql json

案例

在我们的MySql数据库中,数据存储在组合的json字符串中,如下所示:

| ID | DATA |

| 100  | {var1str: "sometxt", var2double: 0,01, var3integer: 1, var4str: "another text"} |
| 101  | {var3integer: 5, var2double: 2,05, var1str: "txt", var4str: "more text"} |

问题

大多数DATA字段包含2500多个变量。 DATA-string中变量的顺序是随机的(如上例所示)。现在我们只知道如何使用以下查询提取数据:

select   
ID, 
json_extract(DATA,'var1str'),
json_extract(DATA,'var2double'),
FROM table

使用此查询,仅返回var1str和var2double的值作为结果。变量3和4的值被忽略。 没有概述数据字段中隐藏的可能变量。

有近60,000个条目和超过3.000个可能的唯一变量名,我想创建一个遍历所有60.000 DATA-fields的查询,并提取在那里找到的每个唯一变量名。

解决方案吗

我正在寻找的查询会得到以下结果:

var1str
var2double
var3integer
var4str

我对MySql的了解非常有限。任何获得此解决方案的方向都非常感谢。

1 个答案:

答案 0 :(得分:1)

您使用的是哪个版本的MySQL?。

从MySQL 8.0.4及更高版本支持JSON_TABLE功能,在这种情况下可能很有用。

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.11    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `table`;
Query OK, 0 rows affected (0.09 sec)

mysql> CREATE TABLE IF NOT EXISTS `table` (
    ->   `ID` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->   `DATA` JSON NOT NULL
    -> ) AUTO_INCREMENT=100;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `table`
    ->   (`DATA`)
    -> VALUES
    ->   ('{"var1str": "sometxt", "var2double": 0.01, "var3integer": 1, "var4str": "another text"}'),
    ->   ('{"var3integer": 5, "var2double": 2.05, "var1str": "txt", "var4str": "more text"}');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT
    ->   DISTINCT `der`.`key`
    -> FROM
    ->   `table`,
    ->   JSON_TABLE(
    ->     JSON_KEYS(`DATA`), '$[*]'
    ->     COLUMNS(
    ->       `key` VARCHAR(64) PATH "$"
    ->     )
    ->   ) `der`;
+-------------+
| key         |
+-------------+
| var1str     |
| var4str     |
| var2double  |
| var3integer |
+-------------+
4 rows in set (0.01 sec)

请注意Bug #90610 ERROR 1142 (42000) when using JSON_TABLE