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

Presto查询JSON列展开Map/Array时空值报错问题咨询

问题原因
  • 第一次报错:当key-array/value-array字段值为空字符串时,json_parse接收空串入参会返回null,后续强转array(varchar)时检测到输入为null,触发"Expected a json array, but got null"错误。
  • 第二次修改后报错:coalesce函数只有在第一个参数返回null时才会触发 fallback 逻辑,但json_parse('')接收到空字符串时会直接抛出异常,不会返回null,因此coalesce完全没生效;同时原查询存在字段名书写错误,JSON中字段为key-array/value-array,查询里写的是key-arr/val-arr,也会导致字段取值异常。
修复方案

在调用json_parse之前,先对空串、null类非法输入做预处理,替换为合法的JSON数组字符串,再做解析和类型转换,避免非法输入触发函数异常。参考可直接运行的SQL如下:

select key, 
    value
from ( 
    select cast(json_parse(json_payload) as map(varchar, json)) parsed 
    from my_table
) a, 
unnest(
    cast(
        json_parse(
            case 
                when cast(parsed['key-array'] as varchar) in ('', 'null') or parsed['key-array'] is null then '[]'
                else cast(parsed['key-array'] as varchar) 
            end
        ) as array(varchar)
    ), 
    cast(
        json_parse(
            case 
                when cast(parsed['value-array'] as varchar) in ('', 'null') or parsed['value-array'] is null then '[]'
                else cast(parsed['value-array'] as varchar) 
            end
        ) as array(varchar)
    )
) as t(key, value)
说明
  • 上述写法对空值场景默认返回空数组[],unnest处理空数组时不会产出任何行,符合空键值对列表不展开的预期。如果需要保留空行,可将默认值替换为符合业务需求的合法JSON数组字符串,例如'[null]'。
  • 不要将空字符串传入json_parse函数,该函数仅接受合法JSON格式的字符串入参,空串、格式错误的字符串都会直接触发运行时异常,必须在函数调用前完成非法值过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:57:19