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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:02:25