首页 > 解决方案 > javascript函数在雪花函数中给出NULL

问题描述

我已经使用 Javascript 在雪花中创建了一个函数来计算字符串距离但是该函数给了我 NULL 值。我无法调试该功能。

代码:

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return toString(s2.length);
    if (!s2.length) return toString(s1.length);

    return toString(Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    ) + 1);
}
$$


select cat_map_trial4('stackoverflow', 'stack') as dist;

输出

dist
NULL

Javascript 出了什么问题?任何帮助,将不胜感激。谢谢你。

标签: javascriptsnowflake-cloud-data-platform

解决方案


你的代码有很多问题

  • 你定义了一个函数,但不使用它,你需要在最后添加一个调用
  • 您错误地使用了 toString,如果您坚持使用字符串,请使用 String(value)
  • 如果你使用字符串,你不能用'+'来添加它们来添加它们的数值......
  • 你最后有一个不必要的+1
  • 你使用这个算法的一个非常慢的实现,你应该使用更快的东西,阅读各种计算它的方法

这是一个更正的版本(仍然很慢,但有效):

CREATE OR REPLACE FUNCTION cat_map_trial4(a string,b string)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS
$$
function levenshteinDistance(s1, s2) {
    if (!s1.length) return s2.length;
    if (!s2.length) return s1.length;
    return Math.min(
        levenshteinDistance(s1.substr(1), s2) + 1,
        levenshteinDistance(s2.substr(1), s1) + 1,
        levenshteinDistance(s1.substr(1), s2.substr(1)) + (s1[0] !== s2[0] ? 1 : 0)
    );
}
return levenshteinDistance(A, B);
$$;

但是你的代码最大的问题是它是完全没有必要的,因为 Snowflake 就像它一样棒,提供了一个内置的、快速的EDITDISTANCE功能:)


推荐阅读