如果我在存储过程中的处理过程中创建/生成了元素列表,请说rownum = [1,2,3,4]。 现在,我想在sql语句中使用此列表来过滤掉行,然后说出select * from mytable,其中rownum不在同一存储过程中的(1,2,3,4)中。 我怎样才能做到这一点? 请指导。 谢谢
答案 0 :(得分:0)
雪花具有ARRAY_CONTAINS(,)函数。
示例: Array_Contains(5,array_construct(1,2,3,4))
答案 1 :(得分:0)
对此的一般解决方案是使用binding variables。但是,集类型目前不支持为bind variables in the Stored Procedure APIs。
JavaScript API确实允许您使用string and array transform functions动态生成SQL,因此可以采用以下方法来解决此问题。
通过形成一组值的SQL语法,将值列表内联到查询中:
CREATE OR REPLACE PROCEDURE SAMPLE()
RETURNS RETURNTYPE
LANGUAGE JAVASCRIPT
AS
$$
var lst = [2, 3, 4]
var lstr = lst.join(',') // "2, 3, 4"
var sql_command = `SELECT * FROM T WHERE C NOT IN (${lstr})` // (2, 3, 4)
var stmt = snowflake.createStatement( {sqlText: sql_command} )
// Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [Literal query string]
[...]
$$;
或者如果使用的值列表可能不安全,则可以生成查询以仅携带正确数量的绑定变量:
CREATE OR REPLACE PROCEDURE SAMPLE()
RETURNS RETURNTYPE
LANGUAGE JAVASCRIPT
AS
$$
var lst = [2, 3, 4]
var lst_vars = Array(lst.length).fill("?").join(", ") // "?, ?, ?"
var sql_command = `SELECT * FROM T WHERE C NOT IN (${lst_vars})` // (?, ?, ?)
var stmt = snowflake.createStatement( {sqlText: sql_command, binds: lst} )
// Runs: SELECT * FROM T WHERE C NOT IN (2, 3, 4) [After bind-substitution]
[...]
$$;