案例
在我们的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的了解非常有限。任何获得此解决方案的方向都非常感谢。
答案 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)