如果参数是数字,我如何在雪花中获得一个 javascript 函数以返回一个值,或者如果参数不是数字,则返回另一个值?
Posted
技术标签:
【中文标题】如果参数是数字,我如何在雪花中获得一个 javascript 函数以返回一个值,或者如果参数不是数字,则返回另一个值?【英文标题】:How can I get a javascript function in snowflake to return one value if the argument is numeric or another value if the argument is not numeric? 【发布时间】:2020-02-11 00:50:50 【问题描述】:我的公司正在从 Oracle 数据库解决方案过渡到雪花数据仓库。我正在将我们的用户定义的 oracle 函数转换为雪花用户定义的函数。如果传递的值是数字,我们在 oracle 中的一个函数将返回 1,如果传递的值是非数字,则返回 0。
更具体地说,我想在 value 列中包含数值时更新列 (x_value)。例如,如果我在行中有一个名为 creditscore 的字段,其值为 700、599、“无记录”,我需要使用数值更新一个字段 (xscore),并将 xscore 字段中的非数字 creditscore 保留为空。
我是 javascript 的新手(好吧,并不是完全是新的——我今天一整天都在使用它),但运气不好。这是基本功能:
CREATE OR REPLACE FUNCTION isnum(x variant)
RETURNS integer
LANGUAGE javascript
'
IF (isNan(x))
RETURN 1;
ELSE RETURN 0;
';
我也尝试过 typeof,但得到了同样的错误,如下所示:
SQL Error [1003] [42000]: SQL compilation error:
syntax error line 4 at position 0 unexpected ''
IF (isNan(x))
RETURN 1;
ELSE RETURN 0;
''.
感谢您的帮助!
【问题讨论】:
【参考方案1】:如果是 Javascript 则区分大小写。
if ( isNaN(x) )
return 1;
else
return 0;
或者你总是可以使用三元运算符:
return ( isNaN(x) ? 1 : 0 );
但是,我以前从未使用过 Snowflake,所以如果它需要 JS 以特定方式格式化,我无法提供帮助(只是香草 JS 语法本身)。
【讨论】:
还有一件事——在 Snowflake 中,让 JavaScript 主体中的 X 大写。那是因为它在体外。【参考方案2】:您不需要为此使用用户定义的函数。您可以使用 Snowflake 的 TRY_TO_NUMBER 函数。
create or replace table TEST1 (s string);
insert into TEST1 select ('Not a number');
insert into TEST1 select ('750');
select try_to_number(s) from TEST_IS_NUMBER;
然后您可以从此选择中插入。
【讨论】:
谢谢。我确信这是一种比我采用的方法更好的方法。所以,这就是我尝试过的和结果。如果它是一个数值,我想用分数更新一个表(我得到的数据有时带有字符串值而不是数值)。这是我尝试过的`UPDATE score SET score_num = raw_score WHERE to_variant(raw_score) = TRUE; '。它运行但更新了 0 行(应该是 7,277)。从雪花文档中,IS_REAL 函数返回 TRUE。有什么建议么?谢谢! 我也试过`UPDATE score SET score_num = raw_score (SELECT iff(is_real(raw_score), raw_score ::integer, NULL));'但得到 SQL Error [1044] [42P13]: SQL compiler error: error line 1 at position 61 Invalid argument types for function 'IS_REAL': (VARCHAR(255))' 错误消息。select try_to_number(real_score);
嗨,Jerry,我编辑了我的代码 sn-p 以反映 raw_score 最初是一个 varchar。 waldente 所暗示的 IS_REAL 函数适用于变体,但不适用于 varchars。让我们知道这是否有效。以上是关于如果参数是数字,我如何在雪花中获得一个 javascript 函数以返回一个值,或者如果参数不是数字,则返回另一个值?的主要内容,如果未能解决你的问题,请参考以下文章