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

标签 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"} |

问题

大多数数据字段包含超过 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)

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

关于mysql - 如何从一个字符串变量中提取唯一的嵌套变量名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50120978/

相关文章:

mysql - 测试MySql语句中的字段长度

java - 如何将数据添加到 json 数组而不是 ArrayList 中?

java - 根据周数从MYSQL中检索数据

php - 如何使用 crypt() 和我的盐生成相同的加密数据库密码字符串值?

javascript - 跨域获取CSV文件

ios - "JSONValue"使用 SBJson 时关键字未被识别?

javascript - 使用 javascript 数组填充 JSON 并修改条目

php - 存在撇号时使用 json_encode 破坏 JSON 对象

mysql - 插入 Y 时更新记录 X 的最佳方法

sql - MySQL数据库挂起的简单Select语句