我正在尝试根据字段具有的不同元素将 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'}
我遇到的问题如下:
提前致谢!
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html 说:
:该类型枚举name FOR ORDINALITY
子句中的行; name 列是一个计数器,类型为COLUMNS
,初始值为 1。 这相当于在UNSIGNED INT
语句中指定列为AUTO_INCREMENT
,可用于区分父行由CREATE TABLE
子句生成的多行具有相同的值。NESTED [PATH]
但是https://dev.mysql.com/doc/refman/8.0/en/json.html说:
附加到选择数组的路径的为数组中位置[N]
处的值命名。 数组位置是从零开始的整数。N
(在这两种情况下都强调我的)
如果您使用,您的查询将有效
...CONCAT('$[', idx-1, ']')...