Snowflake JavaScript UDF引用列时报错:无法读取undefined的toLowerCase属性
问题解决:Snowflake JavaScript UDF处理列输入时的TypeError错误
错误根源
报错是因为parent_supplier列存在NULL值。当Snowflake将NULL传入JavaScript UDF时,对应的SUPPLIER_NAME变量会变为undefined,调用toLowerCase()方法自然触发Cannot read properties of undefined错误。另外原函数还有两个潜在问题:
- 未找到匹配key时,
new_supplier未初始化,会返回undefined - 手动拼接JSON字符串的方式容易出现转义错误
修复后的UDF代码
CREATE OR REPLACE FUNCTION map_supplier(supplier_name varchar, supplier_replace varchar) RETURNS string LANGUAGE JAVASCRIPT AS $$ // 处理输入为NULL的情况,直接返回原值 if (SUPPLIER_NAME === undefined || SUPPLIER_NAME === null) { return SUPPLIER_NAME; } // 更安全的方式将supplier_replace转为JSON对象 const kvPairs = SUPPLIER_REPLACE.split(/\s*,\s*/).map(pair => { const [key, value] = pair.split(/\s*:\s*/); return `"${key.toLowerCase()}":"${value}"`; }); const jsonStr = `{${kvPairs.join(',')}}`; const obj = JSON.parse(jsonStr); const supplier = SUPPLIER_NAME.toLowerCase(); // 初始化默认值为原供应商名称,避免无匹配时返回undefined let new_supplier = SUPPLIER_NAME; for (const key in obj) { if (supplier.includes(key)) { new_supplier = obj[key]; // 找到第一个匹配后跳出循环,提升性能 break; } } return new_supplier; $$;
调用方式
和你原有的调用逻辑一致即可,UDF内部已处理NULL值:
select parent_supplier , map_supplier(parent_supplier, 'Fedex:Fedex') from your_table;
额外优化建议
- 函数名避免用
function这类关键字,改成有业务意义的名称(比如map_supplier),防止语法冲突 - 如果映射规则固定,可将映射对象提前定义在UDF内,或用Snowflake字典表维护,避免每次调用都传递字符串参数
- 若需匹配完全相等的供应商名称,把
includes替换为===更精准
内容的提问来源于stack exchange,提问作者mmille
相关产品推荐
相关产品推荐

