PostgreSQL函数日期参数传递异常导致结果为空问题求助
问题排查与解决
核心问题
你在函数的DECLARE块中重复声明了参数d_date date,这会覆盖外部传入的参数值,导致函数内部使用的d_date是未初始化的NULL。当执行WHERE cr.created_at::date > d_date时,任何值与NULL的比较结果都是NULL,因此不会返回任何数据。而硬编码日期时,使用的是具体有效值,所以能得到正确结果。
修改后的函数代码
删除DECLARE块中多余的d_date date声明即可:
CREATE or replace FUNCTION testing_lockstep(_id_arr int[], _counter_arr int[], d_date date) RETURNS TABLE (uc__id int) LANGUAGE plpgsql AS $func$ DECLARE _id int; _counter int; -- 移除重复声明的d_date date BEGIN FOR _id, _counter IN SELECT * FROM unnest (_id_arr, _counter_arr) t LOOP RETURN QUERY WITH orig_dataset AS ( SELECT a.uc_id, cr.imei, cr.points_geom, cr.created_at AS time_created FROM campaign_routes cr LEFT JOIN assets a ON a.imei = cr.imei WHERE cr.created_at::date > d_date ) SELECT uc_id FROM orig_dataset; END LOOP; END $func$;
额外注意点
- 函数返回定义的字段是
uc__id,但查询返回的是uc_id,会导致字段名不匹配,建议统一为相同名称。 - 当前代码中
FOR循环遍历_id_arr和_counter_arr,但循环体内并未使用_id和_counter变量,若这部分逻辑是冗余的,可考虑删除循环直接执行查询,避免不必要的重复执行。
内容的提问来源于stack exchange,提问作者analyst92
相关产品推荐
相关产品推荐

