如何在Redshift存储过程中将JSON字符串转为临时表?
Redshift存储过程中将JSON数组字符串转为临时表的简便方法
首先要注意:你提供的示例JSON属性名没有用双引号包裹,这属于非标准JSON,Redshift的JSON解析函数无法正常处理,所以必须确保p_filters传入的是标准JSON格式(属性名必须加双引号),比如:
[{"idToFilter": 1, "range":"2:2", "idChildren": 4, "description": "blabla1"}, {"idToFilter": 2, "range":"3:5", "idChildren": 3, "description": "blabla2"}, {"idToFilter": 3, "range":"2:6", "idChildren": 2, "description": "blabla3"}]
针对你的需求,直接用JSON_PARSE结合UNNEST就能实现,这是Redshift里最简便的方式,无需复杂逻辑。以下是完整的存储过程实现:
CREATE OR REPLACE PROCEDURE get_filtered_results ( p_id smallint, p_filters varchar(65535), rs_out REFCURSOR ) LANGUAGE plpgsql AS $$ BEGIN -- 创建临时表,展开JSON数组并提取各字段为列 CREATE TEMPORARY TABLE tmp_filter AS SELECT filter_obj.idToFilter::smallint, filter_obj.range::varchar(10), filter_obj.idChildren::smallint, filter_obj.description::varchar(255) FROM -- 解析JSON字符串为super数组,再拆分为单行的JSON对象 UNNEST(JSON_PARSE(p_filters)) AS filter_obj; -- 如需通过游标返回临时表数据,执行以下语句 OPEN rs_out FOR SELECT * FROM tmp_filter; END; $$;
关键逻辑说明
JSON_PARSE(p_filters):将输入的字符串解析为Redshift的super类型,这里对应一个JSON数组UNNEST(...) AS filter_obj:把super数组拆分为多行记录,每行是一个独立的JSON对象(super类型)- 字段提取:通过
.直接访问JSON对象的属性,同时显式转换为对应的数据类型(避免super类型的隐式转换风险,提升查询性能)
如果你的JSON字段不固定,需要动态适配,可以结合JSON_KEYS和动态SQL实现,但如果字段是固定的,上述静态方法是最高效的方案。
内容的提问来源于stack exchange,提问作者JudgeProphet
相关产品推荐
相关产品推荐

