You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Presto中UNNEST SQL列内可变的JSON键值对列表

在Presto中UNNEST可变键的JSON字典

你的错误原因是:JSON对象本质是键值映射(Map),而非数组,直接将其转为ARRAY(ROW(...))类型不符合数据结构,导致转换失败。

正确的做法是先将JSON解析为MAP类型,再通过UNNEST展开键值对:

基础示例(值均为字符串)

WITH example(json_info) AS (
    VALUES ('{"Key A": "ABC","Key B": "DEF", "Key C": "XYZ"}') 
)
SELECT 
    map_key AS key, 
    map_value AS value
FROM example
CROSS JOIN UNNEST(CAST(JSON_PARSE(json_info) AS MAP(VARCHAR, VARCHAR))) AS x(map_key, map_value);

处理多类型值的情况

如果JSON中值的类型不固定,可以先转为MAP(VARCHAR, JSON),再按需转换值的类型:

WITH example(json_info) AS (
    VALUES ('{"Key A": "ABC","Key B": 123, "Key C": true}') 
)
SELECT 
    map_key AS key, 
    map_value,
    -- 按类型提取值
    CASE WHEN JSON_TYPE(map_value) = 'STRING' THEN JSON_EXTRACT_SCALAR(map_value, '$') END AS string_value,
    CASE WHEN JSON_TYPE(map_value) = 'NUMBER' THEN JSON_EXTRACT_SCALAR(map_value, '$')::INT END AS int_value,
    CASE WHEN JSON_TYPE(map_value) = 'BOOLEAN' THEN JSON_EXTRACT_SCALAR(map_value, '$')::BOOLEAN END AS bool_value
FROM example
CROSS JOIN UNNEST(CAST(JSON_PARSE(json_info) AS MAP(VARCHAR, JSON))) AS x(map_key, map_value);

内容的提问来源于stack exchange,提问作者will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 16:25:32