根据条件将变量分配给Snowflake SQL

问题描述

我试图基于作为存储过程中的参数传递的输入变量执行sql命令。如果传递的参数是INCR,我想将一部分sql附加到最终的SQL查询变量中。

var exec_cmnd = (load_type == 'INCR') ? "AND EXISTS (SELECT 1 FROM tbl T WHERE inner_tbl.id = outer_tbl.id)" : "1 = 1";  

var qry = "`select * from tbl_a where name=name and `+exec_cmnd+`";

sNowflake.execute({sqlText:qry});

但是条件似乎抛出了错误。请让我知道如何根据IF条件将变量分配给sql命令查询变量吗?

解决方法

如果将load_type传递给存储过程,则需要在JavaScript主体中将其大写。

https://docs.snowflake.com/en/sql-reference/stored-procedures-usage.html#case-sensitivity-in-javascript-arguments

您的连接略微关闭。我强烈建议在JavaScript存储过程中为SQL使用JavaScript文字模板。

以反勾打开您的字符串,然后以反勾关闭。然后,您可以通过将其包装为$ {myVariable}来替换任何JavaScript变量。它还允许您在SQL中使用单引号,双引号和多行语句,而不会出现问题。

create or replace procedure foo(load_type string)
returns string
language javascript
as
$$

var exec_cmnd = (LOAD_TYPE == 'INCR') ? "EXISTS (SELECT 1 FROM tbl T WHERE inner_tbl.id = outer_tbl.id)" : "1 = 1";  

var qry = `select * from tbl_a where name=name and ${exec_cmnd}`;

return qry;

$$;

call foo('INCR');