Snowflake中合并去重排序日期数组的JS UDF报错问题咨询
报错根因
传入ARRAY_MERGE函数的其中一个数组参数为NULL,对应到JS代码中变量值为undefined,调用concat方法时触发类型错误。你的现有代码还存在冗余逻辑,可同步优化。
修复方案
方案1:优化自定义UDF
调整UDF逻辑先对入参做非空兜底,同时简化冗余代码:
CREATE OR REPLACE FUNCTION array_merge(old_date_list ARRAY, new_date_list ARRAY) RETURNS ARRAY LANGUAGE JAVASCRIPT AS $$ // 入参为NULL时兜底为空数组 const oldList = OLD_DATE_LIST || []; const newList = NEW_DATE_LIST || []; // 合并、去重、排序、过滤空值 return [...new Set([...oldList, ...newList])] .filter(date => date && date !== '') .sort(); $$ ;
调用时可加一层空值兜底更稳妥:
SELECT ARRAY_MERGE( IFNULL(ARRAY_COMPACT(c.array_visit_dates), ARRAY_CONSTRUCT()), IFNULL(ARRAY_COMPACT(d.array_visit_dates), ARRAY_CONSTRUCT()) ) AS array_visit_dates FROM myTable
方案2:使用原生SQL函数实现(性能更优)
不需要自定义UDF,直接用数据库内置数组函数即可完成需求,执行效率更高,也不会出现JS类型错误:
SELECT ARRAY_SORT( ARRAY_DISTINCT( ARRAY_CAT( IFNULL(ARRAY_COMPACT(c.array_visit_dates), ARRAY_CONSTRUCT()), IFNULL(ARRAY_COMPACT(d.array_visit_dates), ARRAY_CONSTRUCT()) ) ) ) AS array_visit_dates FROM myTable
用到的内置函数说明:
ARRAY_CAT:合并两个数组ARRAY_DISTINCT:数组元素去重ARRAY_SORT:数组升序排序IFNULL:NULL值兜底为空数组
补充说明
如果你的日期不是ISO标准字符串格式,JS默认的字典序排序会出现异常,优先使用原生SQL方案,内置排序会自动识别日期类型完成正确排序。
内容的提问来源于stack exchange,提问作者RagePwn
相关产品推荐
相关产品推荐

