MySQL Json 字段根据给定的键数量分成行

问题描述 投票:0回答:1

我正在尝试根据字段具有的不同元素将 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. 我返回了三行(如预期),但第三行的键为空,它应该是“provider3”
  2. 我需要对键的值做同样的事情,但我认为解决第 1 点我将能够复制

提前致谢!

sql mysql json
1个回答
1
投票

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

name FOR ORDINALITY
:该类型枚举
COLUMNS
子句中的行; name 列是一个计数器,类型为
UNSIGNED INT
初始值为 1。 这相当于在
AUTO_INCREMENT
语句中指定列为
CREATE TABLE
,可用于区分父行由
NESTED [PATH]
子句生成的多行具有相同的值。

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

附加到选择数组的路径的

[N]
为数组中位置
N
处的值命名。 数组位置是从零开始的整数。

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

如果您使用,您的查询将有效

...CONCAT('$[', idx-1, ']')...
© www.soinside.com 2019 - 2024. All rights reserved.