RedShift调用json_extract_array_element_text报函数不存在如何修复
RedShift数组拆分报错修复方案
报错根因
json_extract_array_element_text函数不支持SUPER类型的入参,你查询中的values字段是从JSON_PARSE解析后的SUPER结构中提取的数组,和函数要求的入参类型不匹配,同时第三个可选布尔参数多余传参也可能触发函数匹配失败。
修复方案
推荐使用RedShift原生支持SUPER类型的UNNEST语法实现数组拆分,不需要自行创建序列表,写法更简洁性能也更优,且可以直接输出你要求的格式:
WITH all_values AS ( SELECT c.*, d.desc, d.name, d.values as origin_values FROM ( SELECT id, created, JSON_PARSE(inputs) AS inputs_super FROM course.table WHERE prompttype = 'input' ) AS c, c.inputs_super AS d ORDER BY created DESC LIMIT 10 ) SELECT av.id, av.created, av.inputs_super, av.desc, av.name, ARRAY[split_val] as values FROM all_values av, UNNEST(av.origin_values) as t(split_val);
如果要保留你原有序列表的写法,只需要对SUPER类型做转换即可:
-- 仅修改split_values部分代码 split_values AS ( SELECT id, json_extract_array_element_text(JSON_SERIALIZE(values), seq.i) AS size FROM all_values, seq_0_to_100 AS seq WHERE seq.i < JSON_ARRAY_LENGTH(JSON_SERIALIZE(values)) )
补充说明
JSON_SERIALIZE函数可以把SUPER类型的数据序列化为标准JSON字符串,匹配普通JSON操作函数的入参要求;而UNNEST语法是RedShift专门用于拆分SUPER数组的内置功能,直接按数组元素拆分多行,不需要手动维护序列长度,适配性更强。
内容的提问来源于stack exchange,提问作者Viktor Andriichuk
相关产品推荐
相关产品推荐

