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

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$;

额外注意点

  1. 函数返回定义的字段是uc__id,但查询返回的是uc_id,会导致字段名不匹配,建议统一为相同名称。
  2. 当前代码中FOR循环遍历_id_arr和_counter_arr,但循环体内并未使用_id和_counter变量,若这部分逻辑是冗余的,可考虑删除循环直接执行查询,避免不必要的重复执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:30:56