【问题标题】:Convert JSON field to key value pair in mysql将JSON字段转换为mysql中的键值对
【发布时间】:2021-08-14 19:27:11
【问题描述】:

我将预测存储在 mysql 表的 JSON 字段中,如下所示

SELECT id, value from predictions

id | value                 |
+--------------------------+
1  | {"class1": 0.99, "class2": 0.05}
2  | {"class1": 0.94, "class2": 0.01, "class3": 0.4}
...

每一行都包含一个带有(可能)不同键的字典,但每个字典都遵循这个模式。

我想将其反序列化为如下键值结果:

id | class  | confidence |
+------------------------+
1  | class1 | 0.99       |
1  | class2 | 0.05       |
2  | class1 | 0.94       |
2  | class2 | 0.01       |
2  | class3 | 0.4        |

如果 JSON 格式为包含每个预测类的一个字典的列表格式,我可以使用 JSON_TABLE,因为我正在使用 MySQL > 8.0,但是我不知道如何这样做。

【问题讨论】:

    标签: mysql sql json


    【解决方案1】:

    当您使用 MySql 8.0 时,您可以使用 JSON_KEYS()JSON_EXTRACT()JSON_TABLE 来满足您的要求,如下所示:

    SELECT 
        id,
        class, 
        json_extract(value_,concat('$.',class)) confidence 
    from test t1
    cross join 
        json_table(
            json_keys(value_)
            , '$[*]' columns(class varchar(10) path '$')
        ) t2
    

    DEMO

    【讨论】:

    • 太好了,谢谢!对于以后的读者,请注意,如果您的类名包含空格,则 JSON_EXTRACT 中创建的 json 路径需要用双引号封装,如下CONCAT('$."', class, '"')
    • 出于好奇的另一个问题:将 json_keys 强制转换为 json 是必要的吗?我在我的用例中没有使用它进行测试,它工作正常
    • 这不是强制性的。其实 JSON_KEYS() 返回就足够了。
    猜你喜欢
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2013-05-03
    相关资源
    最近更新 更多