案例
在我们的 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"} |
问题
大多数数据字段包含超过 2500 个变量。数据字符串中变量的顺序是随机的(如上例所示)。现在我们只知道如何使用以下查询提取数据:
select
ID,
json_extract(DATA,'var1str'),
json_extract(DATA,'var2double'),
FROM table
对于此查询,仅 var1str 和 var2double 的值将作为结果返回。变量 3 和 4 的值被忽略。 没有概述数据字段中隐藏的可能变量。
有近 60.000 个条目和超过 3.000 个可能的唯一变量名称,我想创建一个查询,循环遍历所有 60.000 个数据字段并提取其中找到的每个唯一变量名称。
解决方案?
我正在寻找的查询将给出以下结果:
var1str
var2double
var3integer
var4str
我对MySql的了解非常有限。非常感谢为实现此解决方案而提供的任何指示。
最佳答案
您使用的 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)
关于mysql - 如何从一个字符串变量中提取唯一的嵌套变量名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50120978/