如何在雪花存储过程中进行数学计算?

How to do mathematical computation in stored procedure in snowflake?

加入两个 Snowflake 表后我得到一个计数 (*)。这是在存储过程中完成的。如果计数大于零,我需要传递一个值。我的存储过程从 NiFi 处理器调用,我必须 return NiFi 的值,以便可以从 NiFi 发送电子邮件。

我得到 'NaN' 作为以下代码的输出。

CREATE OR REPLACE PROCEDURE test_Delete_excep()
returns float not null

language javascript
as

$$
var rs;
var return_value = 0;

var SQL_JOIN = "select count(*) from (Select GT.VARIANTDATA from GOV_TEST GT inner join GOV_TEST_H GTH on GT.VARIANTDATA:COL1::String = GTH.VARIANTDATA:COL1::String where to_char(GT.VARIANTDATA) != to_char(GTH.VARIANTDATA));";

var stmt = snowflake.createStatement({sqlText: SQL_JOIN});
      
rs = stmt.execute();
rs.next();
return_value += JSON.stringify(rs.getColumnValue(1));

if (return_value > 0) { return 'email required';}

$$;

结果如下:

Row                     TEST_DELETE_EXCEP
1                                     NaN

如何进行算术计算并return给NiFi处理器一个值?

您永远不会 returning 浮点值,SP 将其定义为 return 类型。如果 return_value 大于 0,它将尝试 return 字符串 'email required.',这不是浮点数。这将生成一个 NaN。如果 return_value 不大于 0,则代码永远不会 return 任何类型的值。那将 return NULL。由于您为 return 指定 NOT NULL,这将强制它为 NaN

此外,我不确定您为什么要对 rs.getColumnValue(1) 进行字符串化。 select count(*) 将产生一个整数值,您可以直接读取它。

你可能想要这样的东西:

CREATE OR REPLACE PROCEDURE test_Delete_excep()
returns float not null

language javascript
as

$$
var rs;
var return_value = 0;

var SQL_JOIN = "select count(*) from (Select GT.VARIANTDATA from GOV_TEST GT inner join GOV_TEST_H GTH on GT.VARIANTDATA:COL1::String = GTH.VARIANTDATA:COL1::String where to_char(GT.VARIANTDATA) != to_char(GTH.VARIANTDATA));";

var stmt = snowflake.createStatement({sqlText: SQL_JOIN});
      
rs = stmt.execute();

if(rs.next()) {
  return_value = rs.getColumnValue(1);
} else {
  return -1;
}
return return_value;

$$;

这将 return 您的联接产生的行数 SQL。如果您想要不同的东西,请说明所需的输出。