我正在try 将json字段拆分为N行,给定该字段具有的不同元素.

这是我正在使用的查询:

    WITH Jsonified AS (
    SELECT 
        test_json_data,
        CAST(REPLACE(REPLACE(test_json_data, "\\'", "''"), "'", '"') as json) as json_data
    FROM vt_raw_data
    WHERE full_url = 'test'
)
SELECT 
    j.json_data,
    JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(j.json_data), CONCAT('$[', idx, ']'))) AS `key`-- ,
    -- JSON_UNQUOTE(JSON_EXTRACT(j.json_data, CONCAT('$.', JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(j.json_data), CONCAT('$[', idx, ']')))))) AS `value`
FROM Jsonified j
CROSS JOIN JSON_TABLE(JSON_KEYS(j.json_data), '$[*]' COLUMNS (idx FOR ORDINALITY)) AS keys_idx;

以下是数据样本:

{'provider1': 'malicious', 'provider2': 'malware', 'provider3': 'malware'}

我遇到的问题如下:

  1. 我返回了三行(如预期),但第3行的键为空,应该是"provider 3"
  2. 我需要对密钥的价值做同样的事情,但我认为解决第1点我将能够复制

提前感谢!

推荐答案

https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html says:

name FOR ORDINALITY:该类型列举COLUMNS条款中的行;名为Name的列是类型为UNSIGNED INTwhose initial value is 1.的计数器这相当于在CREATE TABLE陈述中将列指定为AUTO_INCREMENT,可以用于区分NESTED [PATH]条款生成的多行具有相同值的父行.

https://dev.mysql.com/doc/refman/8.0/en/json.html说:

附加到 Select 数组的路径的[N]命名数组内位置N处的值.Array positions are integers beginning with zero.

(两种情况下都强调我的)

如果您调整差一的差异,您的查询就会有效:

...CONCAT('$[', idx-1, ']')...

Mysql相关问答推荐

MySQL 8.0.28覆盖(和函数)索引未使用

正则表达式转换为MYSQL格式

过程/别名是有点长的MySQL命令的一部分吗?

如何将左联接的小计/总计行中的所有列作废

MySQL grant语句中的用户名区分大小写

DJANGO 使用原始 MYSQL 查询计算记录数并在 html 模板中使用结果

如何在 MySQL 中对同一个表的多个列进行 INNER JOIN

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

带有 JOIN 和 WHERE 子句的 INSERT 语句

如何在 axios 请求中将更新的设置状态值作为参数传递

如何在 SQL 中计算留存曲线?

如何使用 express.js 和 react.js 删除连接表中的元素和关联元素

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

MySQL REGEXP 在没有 BINARY 模式的情况下区分大小写?

MySQL中两个时间字段的分钟差

MySQL:如何多次加入同一张表?

MySQL:将日期时间插入其他日期时间字段

如何存储百分比值?

你如何 OR 两个 LIKE 语句?

问号在 MySQL 中WHERE column = ?的意义是什么?