如果参数是数字,我如何在雪花中获得一个 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 函数以返回一个值,或者如果参数不是数字,则返回另一个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较雪花中的数字字符串

如何获取雪花交易中使用的所有查询?

我如何从多个表中复制到?雪花

如何将二进制表示的数字转换为雪花数

在雪花结果集中用逗号分隔输出数字

如何在雪花中获取用户角色层次结构?